x86-64长双精度浮点数

7

在Intel 64位平台上,long double的实际精度是多少?它是80位填充到128位还是实际的128位?

如果是前者,除了使用gmp外,是否有其他选项可以实现真正的128位精度?


关于整数,使用__int128_t__uint_128_t“类型”,gcc提供了128位精度算术。 - rafak
对于fp(gcc> 4.5),有__float128软件模拟浮点数。 - osgx
4个回答

10

x86-64精度与常规x86相同。扩展双精度为80位,使用x87 ISA,并添加了6个填充字节。没有128位FP硬件。

软件实现四重或扩展四重精度可能会从x86-64 64x64 => 128整数乘法指令中获益。


4
我建议使用MPFR。它是一个更为复杂的多精度浮点数库,构建在GMP之上。

2

很有可能两者都是64位(取决于编译器和操作系统),因为编译器正在发出标量SSE2而不是x87指令。

x86不支持高于80位的精度,但如果您真的需要超过64位的FP算法,最好检查您的数值计算而不是用蛮力解决问题。


你曾经注意到这种行为吗?至少在GCC中,我不认为可以禁止它发出x87。 - Potatoswatter
1
Potatoswatter:尝试使用“-msse2 -mfpmath=sse”,这应该会导致它使用SSE指令来处理“double”和“float”类型的数据,但对于“long double”类型的数据,它可能仍然使用x87指令。 - caf
1
微软编译器都会发出标量SSE2。在Windows的x64程序中,x87已经被弃用。我相信GCC也是这样做的,因为它更快,而且x64 CPU保证支持SSE2。但是对于长双精度浮点数,可能仍然会发出x87。 - Axel Gneiting
3
x86-64 ABI(http://www.x86-64.org/documentation/abi.pdf)实际上规定了 long double 是 x87 的80位扩展精度格式。 - caf
并非所有系统都使用官方ABI。 - Axel Gneiting
显示剩余2条评论

1
我建议使用Boost封装而不是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的说明

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接