web-dev-qa-db-ja.com

std :: numeric_limits :: infinity()の逆はゼロですか?

1./std::numeric_limits<double>::infinity()がゼロ(または少なくとも少数)であることを保証するC++標準(またはIEEE 754浮動小数点標準)に何かありますか?

21
davidhigh

はい、GNU Cライブラリリファレンスマニュアル(IEEE 754を想定)によると:

無限大は、予想どおりに計算を通じて伝播します。たとえば、2 +∞=∞、4 /∞= 0

https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html

C++コンパイラがIEEE754を使用しているかどうかを確認することをお勧めします。

C++コンパイラがIEEE754浮動小数点標準を使用しているかどうかを確認する方法

11
Gonen I

有限数を無限大で割ると、IEEE 754ではゼロになります(したがって、ほとんどの一般的なC++実装でも同じです)。

分子と分母の符号が異なる場合、結果は負のゼロになります。これはゼロに等しくなります。

15
John Zwinck

IEEE 754-2008 6.1によると:

浮動小数点演算における無限大の動作は、そのような制限が存在する場合に、任意に大きな大きさのオペランドを使用する実数演算の制限ケースから導き出されます。無限大はアフィンの意味で解釈されるものとします。つまり、-∞<{すべての有限数} <+∞です。

無限オペランドの演算は通常正確であるため、例外はありません…

xが無制限に増加するときの1/xの制限はゼロであるため、この節の結果は1 /∞がゼロになることです。

6.3節は、結果の符号が+であることを示しています。

入力も結果もNaNでない場合、積または商の符号は、オペランドの符号の排他的論理和OR;…

4

if(std::numeric_limits<double>::is_iec559) yes(); else no();

(18.3.2.4を参照)

IEEE754と同一のIEC559は、それが事実であることを保証します。ただし、C++ 保証はしません IEC 559が設定されている方法(ただし、99.99%の場合はそうですが、それでも必要です)確認するため)。

1
Damon