我试图辨别是否可以将双精度 IEEE 浮点值分解为两个整数,并在以后完全保真地重新组合它们。想象一下这样的事情:
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 接口)我无法控制其存储格式)并在重新组合两个 64 位整数时返回一个位精确的双精度数。
我对 IEEE 浮点有一个概念性的理解,并且我知道双精度数是以 2 为基数存储的。我凭经验观察到,使用上述方法,有时foo != bar
甚至对于非常大的<someConstant>
. 我已经离开学校一段时间了,我无法完全理解在不同的基础(或其他一些因素)下这是否可能。
编辑:
我想这是在我的大脑中暗示/理解的,但在这里没有捕捉到:在这种情况下,我保证问题中双精度的总体幅度将始终在 +/- 2^63 以内(并且 > 2^-64) . 有了这种理解,整数部分可以保证适合 64 位 int 类型,那么我的期望是,在大约 16 位的十进制精度下,小数部分也应该很容易用 64 位 int 类型表示。