1./std::numeric_limits<double>::infinity()
がゼロ(または少なくとも少数)であることを保証するC++標準(またはIEEE 754浮動小数点標準)に何かありますか?
はい、GNU Cライブラリリファレンスマニュアル(IEEE 754を想定)によると:
無限大は、予想どおりに計算を通じて伝播します。たとえば、2 +∞=∞、4 /∞= 0
https://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html
C++コンパイラがIEEE754を使用しているかどうかを確認することをお勧めします。
有限数を無限大で割ると、IEEE 754ではゼロになります(したがって、ほとんどの一般的なC++実装でも同じです)。
分子と分母の符号が異なる場合、結果は負のゼロになります。これはゼロに等しくなります。
IEEE 754-2008 6.1によると:
浮動小数点演算における無限大の動作は、そのような制限が存在する場合に、任意に大きな大きさのオペランドを使用する実数演算の制限ケースから導き出されます。無限大はアフィンの意味で解釈されるものとします。つまり、-∞<{すべての有限数} <+∞です。
無限オペランドの演算は通常正確であるため、例外はありません…
xが無制限に増加するときの1/xの制限はゼロであるため、この節の結果は1 /∞がゼロになることです。
6.3節は、結果の符号が+であることを示しています。
入力も結果もNaNでない場合、積または商の符号は、オペランドの符号の排他的論理和OR;…
if(std::numeric_limits<double>::is_iec559) yes(); else no();
(18.3.2.4を参照)
IEEE754と同一のIEC559は、それが事実であることを保証します。ただし、C++ 保証はしません IEC 559が設定されている方法(ただし、99.99%の場合はそうですが、それでも必要です)確認するため)。