C / C ++中的NaN比较规则

时间:2016-08-05 22:56:11

标签: c++ c nan

对一段代码进行一些优化,代码的正确性取决于编译器如何处理NaN。

我阅读了关于NaN的IEEE-754规则,其中规定:

  

比较EQ,GT,GE,LT和LE,当其中一个或两个操作数时   是NaN返回FALSE。

     

比较NE,当其中一个或两个操作数为NaN时返回TRUE。

上述规则是否在C / C ++中实施?

2 个答案:

答案 0 :(得分:9)

C / C ++不需要特定的浮点表示,也不要求与NaN进行任何比较false

在C ++中,您可以使用std::numeric_limits::is_iec559检查所有浮点类型是否符合IEEE 754:

  

static constexpr bool is_iec559;

     

56 当且仅当类型符合IEC 559标准时才为真。 217

     

57 对所有浮点类型都有意义。

           

217)国际电工委员会标准559与IEEE 754相同。

对于NaN的其他浮点表示比较 可能会也可能不会以同样的方式行事。

事实上,即使代表NaN本身也不是必需的。见std::numeric_limits<T>::has_quiet_NaNstd::numeric_limits<T>::has_signaling_NaN

答案 1 :(得分:5)

<div id="login-box-inner"> <?php $form = ActiveForm::begin([ 'id' => 'login-form', 'options' => ['role'=>'form'], 'fieldConfig' => [ 'options' => [ 'tag' => 'span', ], ], ]); ?> <?= $form->field($model, 'username',[ 'template' => ' <div class="input-group"> <span class="input-group-addon"><i class="fa fa-user emerald"></i></span> {input} </div> {error}', 'inputOptions' => [ 'placeholder' => 'Username ...', 'class'=>'form-control', ]]) ?> <?= $form->field($model, 'password', [ 'template' => ' <div class="input-group"> <span class="input-group-addon"><i class="fa fa-key emerald"></i></span> {input} </div> {error}', 'inputOptions' => [ 'placeholder' => 'Password ...', 'class'=>'form-control', ]])->input('password') ?> <?php ActiveForm::end(); ?> ==运算符似乎被约束为!=的{​​{1}}行为,如@ AlexD& #39;已经回答了。

但是,IEEE 754比较宏 需要遵循相当于NaN的{​​{1}}规则。来自<math.h>草案N1580 7.12.14 比较宏下的以下内容指出NaN比较宏 需要确保,如果其中一个或IEEE 754两个C11都是<math.h> s:

  • x, yNaN

  • isunordered(x, y)trueisgreater(x, y)isgreaterequal(x, y)都是isless(x, y)

  

关系运算符和相等运算符支持数值之间通常的数学关系。对于任何有序数字值,其中一个关系 - islessequal(x, y)falseless - 都是正确的。关系运算符可能会引发&#34;无效&#34;参数值为greater时的浮点异常。 对于equal和数值,或两个NaN,只有无序关系为真

NaN标准只是推迟NaN关于C++问题的标准:

  

分类/比较函数的行为与具有相应名称的C宏相同   在7.12.3中定义,分类宏,以及7.12.14,C标准中的比较宏。