d1.d2d3d4d5...dnExxx という形式の 10 進数表現を考えます。ここで、xxx は任意の指数であり、d1 と dn の両方が非ゼロです。
区間 (d1.d2d3d4d5...dnExxx, d1.d2d3d4d5...((dn)+1)Exxx) に IEEE 754ダブル?
n は 17 以上である必要があります。問題は、17 をどれだけ上回っているかです。
この数値 n は、 のような 10 進数から倍精度への変換で考慮するのに十分な桁数と関係がありますstrtod()
。そこに答えを見つけたいと思って、 David M. Gayの実装のソースコードを調べました。「40」への暗示がありますが、これが健全な数学的結果の結果なのか、統計的に安全な範囲なのかは不明です。また、「切り捨て」に関するコメントは、切り上げモードで 0.5000000000000000000000000000000000000000000000001 が 0.5 に変換される可能性があるように聞こえます。
Musl の実装は、約 125*9 桁を読み取るようで、これはかなりの量です。次に、「スティッキー」モードに切り替えます。
if (c!='0') x[KMAX-4] |= 1;
最後に、「IEEE 754 double を含む」を「2 つの連続する IEEE 754 double の中間点を含む」に置き換えると、答えはどのように変化しますか?