我想辨别是否有可能将双精度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浮点数有一个概念性的理解,而且我得到的那个双精度数是存储在base-2中的。我凭经验观察到,通过上述方法,有时甚至可以为<someConstant>
的非常大的值foo != bar
。我已经失学了一段时间,并且我无法理解这种循环是否可能,因为考虑到不同的基础(或其他因素)。
编辑:
我想这是隐含/理解我的大脑而不是在这里拍摄的:在这种情况下,我保证在问题的双重的总体规模将始终是在+/- 2^63(和> 2^-64)。有了这样的理解,整数部分保证适合64位int类型,那么我的期望是~16位的小数精度,小数部分也应该很容易用64位int类型表示。
没有办法用'做到这一点,你需要huuge整数。但是,您可以使用重要和指数。检查'frexp'。 –
zch
2013-05-14 13:01:10
为什么不'uint32_t我,f; memcpy(&i,&ipart,4); memcpy(&f,&fpart,4);'? – 2013-05-14 13:03:27
你想让这些整数具有任何特定的含义吗?否则,只需将二进制表示复制到'uint64_t'或'uint32_t'中。 – 2013-05-14 13:04:19