双重变成C中的nan

时间:2013-12-28 16:49:41

标签: c floating-point double nan

我有一个使用int的函数,比如2488来存储温度值。我必须调用函数getTemp()来获取int。 getTemp函数返回double并使用int返回正确的数字。在这种情况下,getTemp()所做的只有return (double)x / 100.0,其中x2488

然后返回的双精度为24.88。然后将此值发送到另一个将double添加到数组的函数。函数称为DAaddDouble(double m, int x, int y),其中m是要添加的值,xy是指定添加double的位置的坐标。

问题是,它变成了nan

double a = getTemp();
//a is correct, i.e. 24.88
DAaddDouble(a, x, y);
/*-----------inside DAaddDouble----------*/
void DAaddDouble(double m, int x, int y)
{
   //at this point, a (or m, same) is 0.nan
   cord = x + y*40; //where to put the double
   snprintf(DARRAY[cord], 5, "%f",m);
   printf(....DARRAY[cord]...);

}

输出:-nan

3 个答案:

答案 0 :(得分:1)

函数DAaddDouble的签名是:

void DAaddDouble(int m, int x, int y)

请注意,m的类型为int,在函数内部,您有:

snprintf(DARRAY[cord], 5, "%f",m);

其中%f期望类型double,它是未定义的行为。

您可能需要的是将参数m设为double(如代码上方所示)。

void DAaddDouble(double m, int x, int y)

答案 1 :(得分:0)

错配原型。

DAaddDouble()的用法之前没有其声明/定义,因此编译器假定函数是:

int DAaddDouble(int m, int x, int y);

在函数定义或函数原型之前使用DAaddDouble()

void DAaddDouble(double m, int x, int y);

一个好的编译器会警告这个。确保启用所有警告。

答案 2 :(得分:0)

您如何知道mNAN。如果您已将“打印”值推断为DARRAY[cord],请考虑格式字符串应为"%lf"而不是"%f"

void DAaddDouble(double m, int x, int y)
{
   //at this point, a (or m, same) is 0.nan
   cord = x + y*40; //where to put the double
   snprintf(DARRAY[cord], 5, "%f",m); /* should be "%lf" for printing doubles */
   printf(....DARRAY[cord]...);

}