倍精度 IEEE 浮動小数点値を 2 つの整数に分解し、後でそれらを完全な忠実度で再構成できるかどうかを識別しようとしています。次のようなものを想像してください。
double foo = <inputValue>;
double ipart = 0;
double fpart = modf(foo, &ipart);
int64_t intIPart = ipart;
int64_t intFPart = fpart * <someConstant>;
double bar = ((double)ipart) + ((double)intFPart) / <someConstant>;
assert(foo == bar);
任意の 64 ビット量を 128 ビットで格納できることは論理的に明らかです (つまり、リテラル ビットを格納するだけです)。ここでの目標は、倍精度浮動小数点数の整数部分と小数部分を整数表現に分解することです (および API 2 つの 64 ビット整数を再構成すると、ビット単位で正確な double が返されます。
私は IEEE 浮動小数点の概念を理解しており、double は基数 2 で格納されることがわかりました。経験的に、上記のアプローチでは、 のfoo != bar
値が非常に大きい場合さえあることがわかります<someConstant>
。私はしばらく学校を休んでいましたが、これが可能かどうかを理解するためのループを完全に閉じることはできません。
編集:
これは私の脳内で暗示/理解されていたと思いますが、ここではキャプチャされませんでした: この状況では、質問の double の全体的な大きさが常に +/- 2^63 (および > 2^-64) 以内になることが保証されます。 . その理解により、整数部分は 64 ビットの int 型に収まることが保証されます。私の予想では、10 進数の精度が 16 ビットまでであれば、小数部分も 64 ビットの int 型で簡単に表現できるはずです。