对一段代码进行一些优化,代码的正确性取决于编译器如何处理NaN。
我阅读了关于NaN的IEEE-754规则,其中规定:
比较EQ,GT,GE,LT和LE,当其中一个或两个操作数时 是NaN返回FALSE。
比较NE,当其中一个或两个操作数为NaN时返回TRUE。
上述规则是否在C / C ++中实施?
答案 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_NaN
,
std::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, y
是NaN
isunordered(x, y)
,true
,isgreater(x, y)
,isgreaterequal(x, y)
都是isless(x, y)
关系运算符和相等运算符支持数值之间通常的数学关系。对于任何有序数字值,其中一个关系 -
islessequal(x, y)
,false
和less
- 都是正确的。关系运算符可能会引发&#34;无效&#34;参数值为greater
时的浮点异常。 对于equal
和数值,或两个NaN
,只有无序关系为真。
NaN
标准只是推迟NaN
关于C++
问题的标准:
分类/比较函数的行为与具有相应名称的C宏相同 在7.12.3中定义,分类宏,以及7.12.14,C标准中的比较宏。