当前位置: C语言 -- 标准库 -- <stdlib.h> -- strtod32

strtod32函数


概要:
#include <stdlib.h>
#ifdef __STDC_IEC_60559_DFP__
  _Decimal32 strtod32(const char * restrict nptr, char ** restrict endptr);
#endif

描述:

该函数将参数nptr指向字符串的初始部分转换为_Decimal32类型的浮点表示形式。

该函数首先将字符串分成三个部分:

1、一个初始的,可能为空的空格字符(可以使用isspace函数检查。)序列;

2、一个类似浮点常量,或者表示无穷大,或者表示非数值的主题序列;

3、由一个或者多个未识别字符组成的最终字符串(final string),包括字符串末尾的终止空字符;

然后尝试将主题序列转换为浮点数,并返回结果。


主题序列的预期形式可能包含+号或者-号,其后应为下述形式之一:

- 一个由十进制数构成的非空序列(可能包含小数点。),其后还可能包含ISO/IEC 9899:2024标准第6.4.5.3 Floating constants节中定义的指数部分,但不包括任何数位分隔符(digit separators);

- 一个以0x或者0X开头,由十六进制数构成的非空序列(可能包含小数点。),其后还可能包含ISO/IEC 9899:2024标准第6.4.5.3 Floating constants节中定义的二进制指数部分,但不包括任何数位分隔符(digit separators);

- INF或者INFINITY(忽略大小写。);

- NAN或者NAN(d-char-sequenceopt)(其中NAN部分忽略大小写。),d-char-sequenceopt由具体实现定义。


主题序列从第一个非空格字符开始,应包含符合上述预期形式的尽可能多的字符。如果字符串不符合上述预期形式,主题序列将不包含任何字符。

如果主题序列具有浮点数的预期形式,以第一个数字字符或者小数点字符(以先出现者为准。)开始的字符序列根据ISO/IEC 9899:2024标准第6.4.5.3 Floating constants节的规则解释为浮点常量;但存在以下例外:

1、使用小数点字符代替句号;

2、如果十进制浮点数中既没有指数部分,也没有小数点字符,或者十六进制浮点数中没有二进制指数部分,则假设在字符串的最后一个数字后紧跟一个具有适当类型的、值为0的指数部分。


如果主题序列以负号(-)开始,该序列舍入前会被解释为算术取反后的值(注:ISO/IEC 9899:2024标准并未明确规定以负号(-)开始的序列是直接转换成负数,还是通过转换相应的无符号序列产生的值取反;如果舍入方向是正无穷大或者负无穷大,这两种方法可能会产生不同的结果。无论哪种情况,如果浮点算术运算支持有符号0,函数将保留0的符号。),并且符号s会设为-1;否则符号s会设为1。


如果主题序列具有十进制浮点数的预期形式,转换结果将正确舍入,并且系数c和量子指数q将根据ISO/IEC 9899:2024标准第6.4.5.3 Floating constants节中关于十进制类型十进制浮点常量的规则确定。


如果主题序列具有十六进制浮点数的预期形式,转换结果将正确舍入,前提是:主题序列最多有M个有效十六进制数字(significant hexadecimal digits),其中M≥⌈(P-1)/4⌉+1由实现定义,P是实现支持的基数为2的浮点类型和二进制非算术交换格式(binary non-arithmetic interchange formats)的最大精度。如果所有十六进制格式的主题序列都能正确舍入,M可视为无穷大。如果主题序列的有效十六进制数字超过M个,实现可以先根据十进制舍入模式将主题序列舍入到M个有效十六进制数字,并在舍入时如同从更宽格式转换那样发出异常信号,然后将缩短的十六进制输入正确舍入到结果类型。如果十六进制数在十进制类型中能够精确表示,结果的首选量子指数(preferred quantum exponent)为0;如果十六进制数在十进制类型中不能精确表示,结果的首选量子指数为最小可能值。


字符序列INF或者INFINITY解释为无穷大。字符序列NAN或者NAN(d-char-sequenceopt)解释为安静非数值(quiet NaN);d-char-sequenceopt的含义由实现定义。


如果参数endptr不是空指针,指向最终字符串的指针存储在参数endptr指向的对象中。

非“C”语言环境中,还可以接受特定语言环境的主题序列。

如果主题序列为空或者不符合预期形式,将不进行任何转换;参数nptr的值将存入参数endptr指向的对象中(前提是参数endptr不是空指针。)。


参数:
const char * restrict nptr

指向待转换字符串的指针。

char ** restrict endptr

指向char *类型对象的指针,指向对象值为字符串中数字值之后的下一个字符的地址。该参数也可以是空指针,这种情况下它不会使用。


返回值:

函数返回转换后的值;如果没有发生转换,函数返回三元组(+1, 0, 0)的值。

在转换结果溢出(overflow)的情况下,如果math_errhandling & MATH_ERRNO是非0值,errno设置为ERANGE;如果math_errhandling & MATH_ERREXCEPT是非0值,则引发FE_OVERFLOW浮点异常。

在转换结果下溢(underflow)的情况下,如果math_errhandling & MATH_ERRNO是非0值,errno是否设置为ERANGE将由实现定义;如果math_errhandling & MATH_ERREXCEPT是非0值,是否引发FE_UNDERFLOW浮点异常将由实现定义。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
/*函数strtod32范例*/

#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    #ifdef __STDC_IEC_60559_DFP__
        const char str[] = "3.14E+2 -3.14 0x1.8p+2";
        const char *ptr = str;	//用于遍历字符串的指针。
        char *endPtr = NULL;	//指向浮点数后第1个字符的指针。
        _Decimal32 number;	//存储读取的浮点数。
      
        while(*ptr != '\0')
        {
            /*让指针指向第一个非空格字符。*/
            while(isspace(*ptr))
                ++ptr;
            
            /*如果到达字符串末尾,将退出循环。*/
            if(*ptr == '\0')
                break;
            
            /*将字符串初始部分转换成浮点数。*/
            errno = 0;
            number = strtod32(ptr, &endPtr);
            
            /*检查转换是否成功。*/
            if(ptr == endPtr)
            {
                puts("No conversion occurred.");
                break;
            }
            
            if(errno == ERANGE)
            {
                puts("Error; out of range");
                errno = 0;
            }
            else
            {
                printf("%.*s: %Hf\n", (int)(endPtr-ptr), ptr, number);
            }
            
            /*移动指针ptr,准备转换下一个浮点数。*/
            ptr = endPtr;
        }
    #else
        puts("The implementation does not support the decimal floating-point type.");
    #endif

    return 0;
}


可能输出:

3.14E+2: 314.000000

-3.14: -3.140000

0x1.8p+2: 6.000000

(注:编译时实现还未支持strtod32函数。)


相关内容:
strtod64 将字符串转换为_Decimal64类型浮点数的函数。
strtod128 将字符串转换为_Decimal128类型浮点数的函数。


主要参考资料:

1、ISO/IEC 9899:2024