【问题标题】:Is NAN returns false when accessing through pointer?通过指针访问时,NAN 是否返回 false?
【发布时间】:2014-02-05 14:06:12
【问题描述】:

我正在编写一个函数,它返回一个指向数字数组的指针。为了能够使用指针遍历数字,我将最后一个元素设置为 NAN 以标记数组的结尾。
我的循环类似于

for(int* it=ptr;!isnan(*it);++it)  
//print *it

但它一直运行直到崩溃,所以我写了一些测试代码:

int* test = new int[1];  
*test = NAN;  
cout << isnan(NAN) << endl;  
cout << isnan(*test) << endl;

结果是:

1
0

我已经看到很多使用NAN 作为数组中的“停止器”的示例。那为什么不起作用呢?

【问题讨论】:

  • NAN 是一个特殊的浮点值(对于floats/doubles)- 没有NAN 用于整数类型。
  • 你应该只存储数组的大小而不是使用一些哨兵值。
  • s/'stopper'/sentinel.

标签: c++ pointers nan math.h


【解决方案1】:

isnan() 仅适用于浮点数。

【讨论】:

    【解决方案2】:

    您的行为未定义,因为您试图将浮点类型的 NAN 转换为 int,而该值不能由 int 表示。

    §4.9/1 [conf.fpint] 浮点类型的纯右值可以转换为整数类型的纯右值。转换截断;也就是说,小数部分被丢弃。如果截断的值无法在目标类型中表示,则行为未定义。

    由于NAN 只是浮点数的一个特殊值,将其存储在int 中没有意义。整数类型没有特殊的非数字值。您可以使用一些特定的值来表示数组的结尾,但这不是一个特别令人愉快的解决方案。

    如果您要像这样动态分配数组,您将不得不自己通过传递它来跟踪它的大小。对于其他数组(实际上您有一些表示数组对象本身的东西,而不仅仅是指向其元素的指针),您可以使用std::end 来查找它的结尾。不过,像往常一样,我建议改用标准容器。

    【讨论】:

    • IIRC 它的实现定义了int 是否可以具有NaN 值。我希望旧的 Crays 支持整数 NaN。
    猜你喜欢
    • 2018-07-04
    • 2012-10-02
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多