【问题标题】:Checking if a number is NaN fails检查数字是否为 NaN 失败
【发布时间】:2012-07-11 15:39:59
【问题描述】:

Divide by Zero PreventionCheck if it's a NaN为例,我编写了以下代码:

#include <cstdlib>
#include <iostream>
#include <map>
#include <windows.h>
using namespace std;
bool IsNonNan( float fVal )
{ 
     return( fVal == fVal );
}

int main(int argc, char *argv[])
{
    int nQuota = 0;
    float fZero = 3 / (float)nQuota; 
    cout << fZero << endl;
    cout << IsNonNan( fZero ) << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

为什么IsNonNan 返回真?还有为什么int nZero = 3 / (float)nQuota;会输出:-2147483648

【问题讨论】:

  • 您可以使用标准的isnan() 函数,在&lt;cmath&gt; 中声明。

标签: c++


【解决方案1】:

int nZero = 3 / (float)nQuota; 输出 -2147483648,因为 0float 的转换是 1e-009 的值,在整个 float f = 0.000000001; 中给出或更小。

【讨论】:

    【解决方案2】:

    不是,不是,NaN 表示“不是数字”,它的意思是,不能用数字表示的东西(像 0 / 0 这样的不确定性在数学上没有数字表示),无穷大,就是这样,无穷大,正的或负的

    要检查浮点数是否为无穷大,可以使用:

    inline bool IsInf(float fval)  {
        return (fval == fval) && ((fval - fval) != 0.0f);
    }
    

    【讨论】:

    • 要检查无穷大,应该使用&lt;cmath&gt; 中的std::isinf。您的其余答案在数学上是不合理的;在标准分析中,无穷大也不是数字。
    • 是的,确实(尽管我怀疑(s?)他倾向于通过 h(im|er)self 来实现它)
    【解决方案3】:

    3 / 0+INF,而不是 NaN。试试0 / 0

    【讨论】:

    猜你喜欢
    • 2016-11-14
    • 2014-11-09
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2016-05-19
    相关资源
    最近更新 更多