正規化された浮動小数点数fが与えられると、fの前後の浮動小数点数が次のとなります。正規化された浮動小数点数fの後(前)の次の正規化浮動小数点数は何ですか?
next_normalized(double&){
if mantissa is not all ones
maximally denormalize while maintaining equality
add 1 to mantissa
normalize
else
check overflow
set mantissa to 1
add (mantissa size in bits) to exponent.
endif
}
しかし、ではなく行うこと、それは、浮動小数点演算を行うことができます:私は、仮数と指数を抽出するビットいじると
、?
std::numeric_limits<double>::epsilon()
として
は1の「近所」の唯一のエラーの違いである - 例えば:
normalized(d+=std::numeric_limits<double>::epsilon()) = d for d large
それは誤り差よりもエラー率だが、これ私の素朴な直感
(1.+std::numeric_limits<double>::epsilon())*f //should be the next.
そして
です特に(1.-std::numeric_limits<double>::epsilon())*f //should be the previous.
私は3つの質問を持っている誰もが(IEEE754のために)次のいずれか行っている:
1)は、この問題に関するエラー解析を行って?
2)は、任意正規二日間
(1.+std::numeric_limits<double>::epsilon())*d != d ?
3)は、二重Fをdはない任意正規ダブル数に対する必要性が存在することを証明した)証明(あるいは証明することができるように
d < f < (1.+std::numeric_limits<double>::epsilon())*d ?
が(そのためにあなたに感謝しないで多くの浮動小数点を行います) – pgast
_denormals_ – kibibu
とは逆のことですが、次の番号を返します。たとえそれが非正規化数であったとしてもです。あなたがnextafter(0.0,1.0)を呼び出すと、非正規化されたケースはそれほどまれではありません.0の次の表現可能な数値は非正規化された数値です(DBL_MINが2e-308の場合は4e-324)。したがって、最初の数値がゼロにならない場合、または非正規化された数値は問題にならない場合にのみ、このソリューションを使用してください。 –