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

nanl函数


概要:
#include <math.h>
long double nanl(const char *tagp);

描述:

该函数根据以下规则转换参数tagp指向的字符串:

调用函数nanl("n-char-sequence")等价于调用函数strtold("NAN(n-char-sequence)", nullptr);调用函数nanl("")等价于调用函数strtold("NAN()", nullptr)。

如果参数tagp未指向n-char-sequence序列或者空字符串,调用该函数等价于调用函数strtold("NAN", nullptr)。


参数:
const char *tagp

参数为指向n-char-sequence序列或者空字符串的指针。


返回值:

函数返回安静非数值(如果可用),其内容通过参数tagp确定。如果实现不支持安静非数值,函数返回0。


范例:
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 
/*函数nanl范例*/

#include <math.h>
#include <stdio.h>
#include <string.h>

void funcNan(const char *tagp)
{
    long double a;
    size_t size = sizeof(long double);
    unsigned char arr[size];
    
    a = nanl(tagp);
    memcpy(arr,&a,size);
    
    printf("nanl(\"%s\"): ", tagp);
    for(size_t i=0; i<size-6; i++)
    {
        printf("%02x", arr[size-6-1-i]);
    }
    
    printf("\n");
}

int main(void)
{
    funcNan("");
    funcNan("1");

    return 0;
}


输出:
nanl(""): 7fffc000000000000000
nanl("1"): 7fffc000000000000001

(注:使用ideone编译。)


Linux/GCC编译条件下,long double类型对象占16字节;但实际有效精度是80位,其余48个位是填充位。

有效精度位分配如下表所示:

有效精度位分配表
组成部分 位数 位置(从高位开始) 描述
符号位
(sign bit)
1 第79位 0表示正数,1表示负数。
指数位
(exponent bits)
15 第78~64位 存储的是实际指数+偏置值(16383)。
整数位
(integer bit)
1 第63位 无穷大、非数值、规格化数时值为1;其余为0。
有效数字位
(significand bits)
63 第62~0位 存储尾数部分。

非数值时,指数位全为1,整数位为1,有效数字位不全为0;因此7fffc000000000000000、7fffc000000000000001表示的均为非数值。详细解释见浮点数的数值范围。


相关内容:
nan double类型的生成安静非数值的函数。
nanf float类型的生成安静非数值的函数。
nand32 _Decimal32类型的生成安静非数值的函数。
nand64 _Decimal64类型的生成安静非数值的函数。
nand128 _Decimal128类型的生成安静非数值的函数。


主要参考资料:

1、ISO/IEC 9899:2024

2、ISO/IEC 9899:2018

3、IEEE Std 754-2019