【问题标题】:Double turns into nan in CDouble在C中变成nan
【发布时间】:2014-01-16 00:05:56
【问题描述】:

我有一个函数使用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

【问题讨论】:

  • 你是如何定义 DARRAY 的?将 DAaddDouble 函数更改为 void DAaddDouble(double m, int x, int y) as a or m is 24.88
  • 对不起,打错了,是双倍的,但问题仍然存在。
  • 你是如何定义 DARRAY 的?
  • 您的问题不太可能出在您引用的片段中。尝试在调试器中逐行查看m 何时变为NaN,如果有的话。

标签: c floating-point double nan


【解决方案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)

【讨论】:

  • 对不起,打错了,是双倍的,但问题仍然存在。
【解决方案2】:

原型不匹配。

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

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

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

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

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

【讨论】:

    【解决方案3】:

    你怎么知道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]...);
    
    }
    

    【讨论】:

    • 格式字符串应为"%lf" 而不是"%f" 不正确。要么会工作。它与scanf() 有功能差异,但不是printf() "l (ell) ... 对以下 a、A、e、E、f、F、g 或 G 转换没有影响" C11dr §7.21 .6.1 7. m 作为floatdouble 被转换/传递给snprintf() 作为double。说明符。
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 2011-04-01
    • 2017-11-27
    • 2017-06-09
    • 2013-08-19
    • 1970-01-01
    • 2022-06-14
    • 2020-01-05
    相关资源
    最近更新 更多