【问题标题】:how to know the existance of NAN value in a double variable?如何知道双变量中存在 NAN 值?
【发布时间】:2011-04-01 01:32:18
【问题描述】:

我在比较 C++、Visualstudio 中的 NAN 值时遇到问题。 我需要在我的代码中处理除零。 如果我被零除,我想将 NAN 分配给结果。 稍后检查结果是否有 NAN。 但是 NAN 比较在稍后的时间点失败,即使我如下分配 quiet_Nan()。

double d = std::numeric_limits<double>::quiet_NaN();
if( d == std::numeric_limits<double>::quiet_NaN())
{
    cout<<" NAN ";
}
else
{
    cout<<" Number";
}

我知道不能比较浮动值是否相等。我尝试获取 d 和 quiet_Nan() 之间的差异,并尝试使用

如何知道双变量中存在NAN值?

【问题讨论】:

标签: c++


【解决方案1】:

我认为当前的标准库不提供任何 is_nan 实现,您需要使用 3rd 方库或自行开发

浮点值可以比较是否相等,它很少有用,但这是有用的地方之一,你想要的是这样的:

template <T>
bool is_nan(T d)
{
  return std::numeric_limits<T>::has_quiet_NaN && d != d;
}

它检查您的机器上是否有适当的 NaN 值,然后使用 NaN != NaN 为真这一事实!

boost 可能应该在某个地方提供这个?

【讨论】:

    【解决方案2】:

    没有任何 C++ 经验,而是:

    if(d == std::numeric_limits::quiet_NaN())

    你应该打电话:

    if(std::numeric_limits::quiet_isNaN(d))

    如果存在这样的方法。

    请记住,如果 'd' 为 NaN,则 d==d 的计算结果为 FALSE

    【讨论】:

    • 是的。 is_nan 或等效的语言就是这样。 NaN 总是按照定义!= 其他任何东西,甚至它自己。
    • quiet_isNan() 方法不可用。我正在使用 VS2008。
    • 测试时不要在意是否是安静的nan。 isnan() 应该足够了。
    【解决方案3】:

    我在 Microsoft 的文档页面上找到了您的信息:

    http://msdn.microsoft.com/en-us/library/w22adx1s.aspx

    试试类似的东西

    if(myDouble != myDouble)
    {
       // myDouble is NaN
    }
    else
    {
       // myDouble is NOT NaN
    }
    

    这应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      • 2017-05-22
      相关资源
      最近更新 更多