Intel 64 位平台上 long double 的实际精度是多少?是 80 位填充到 128 还是实际 128 位?
如果是前者,除了 gmp 之外,还有其他选择可以达到真正的 128 精度吗?
Intel 64 位平台上 long double 的实际精度是多少?是 80 位填充到 128 还是实际 128 位?
如果是前者,除了 gmp 之外,还有其他选择可以达到真正的 128 精度吗?
x86-64 精度与常规 x86 相同。扩展双精度为 80 位,使用 x87 ISA,添加了 6 个填充字节。没有 128 位 FP 硬件。
不过,quad 或扩展 quad 精度的软件实现可能会受益于 x86-64 64x64 => 128 整数乘法指令。
我建议使用MPFR。它是建立在 GMP 之上的更复杂的多精度浮点库。
很有可能两者都是 64 位的(取决于编译器和操作系统),因为编译器发出的是标量 SSE2 而不是 x87 指令。
x86 不支持比 80 位更高的精度,但是如果您确实需要超过 64 位的 FP 算法,您很可能应该检查您的数字,而不是用蛮力解决问题。
我推荐使用 MPFR 或 GMP 的 Boost 包装器:
提升 1.70:cpp_bin_float。
除了任何所需精度的任意类型外,还提供以下类型:
cpp_bin_float_single (24 bits + mantissa = 32 bits)
cpp_bin_float_double (53 bits + mantissa = 64 bits)
cpp_bin_float_double_extended (64 bits + mantissa)
cpp_bin_float_quad (113 bits + mantissa = 128 bits)
cpp_bin_float_oct (237 bits) + mantissa = 256 bits)
Boost 提供了几乎开箱即用的功能。编译完成后,只需在 Visual Studio 项目中添加一个指向包含和库目录的指针即可。
使用 Visual Studio 2017 + Boost v1.70 测试。
请参阅编译 boost 的说明。