如何在c中生产NaN浮子?

Je *_*Rog 18 c floating-point nan

float f = (float)'a';
if(f < 0){ 
}   
else if(f == 0){ 
}   
else if(f > 0){ 
}   
else{
    printf("NaN\n");                                                          
}   
Run Code Online (Sandbox Code Playgroud)

f0如果是a,则不会大于/等于/小于NaN.

但是如何f在第一时间产生这样的?

我尝试了各种方法来制作一个NaN,但没有工作..

Foo*_*Bah 19

要产生纳米,有几种方法:

1)手动生成(读取ieee754以正确设置位)

2)使用宏.GCC公开了一个宏NAN.它在math.h中定义

检查nan的一般方法是检查if (f == f)(对于nan值应该失败)

对于nan,float表示中的指数位应全部设置为1(float由一个有符号位,一组指数位和一组尾数位组成)

  • 您还可以使用`isnan()`来检查NaN(需要C99或(在unix系统上)相应的功能标志,有关详细信息,请参阅联机帮助页) (4认同)

Dan*_*ile 17

使用浮点数0.0 / 0.0不是"除以零"错误; 它导致了NaN.

这个C程序打印-nan:

#include <stdio.h>

int main()
{
    float x = 0.0 / 0.0;
    printf("%f\n", x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

NaN计算机看起来而言,两个"无效"数字被保留用于"信令"和"安静"NaN(类似于为正无穷大保留的两个无效数字).在维基百科条目有大约NaN被如何表示为IEE浮点数的更多细节.

  • 如果`0.0/0.0`,VC++ 2012编译器会出现`C2124`错误. (5认同)
  • @Dan Cecile:我认为除以零将产生一个Indeterminate(IND)数字,而不是NaN. (2认同)
  • @MNS 整数除以零是未定义的行为。C 中没有“不确定数”或“IND”。 (2认同)

Rik*_*ika 6

您可以使用NAN宏,也可以只使用其中一个nan/nanf函数来将nan值分配给变量。
要检查是否要处理nan值,可以使用isnan()。这是一个例子:

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

int main(void) {

    float a = NAN;//using the macro in math.h
    float f = nanf("");//using the function version 
    double d = nan("");//same as above but for doubles!

    printf("a = %f\nf = %f\nd = %f\n",a,f,d);

    if(isnan(a))
        puts("a is a not a number!(NAN)\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行上面的代码片段将为您提供以下输出:

a = nan
f = nan
d = nan
a is a not a number!(NAN)
Run Code Online (Sandbox Code Playgroud)

自己运行代码:http : //ideone.com/WWZBl8
阅读更多信息:http : //www.cplusplus.com/reference/cmath/NAN/

  • 自1999年以来,@skyking`nan`和`nanf` **是标准的ISO C函数**。 (4认同)