x86-64长双精度

时间:2010-05-10 00:11:34

标签: c++ c floating-point precision long-double

英特尔64位平台上的long double的实际精度是多少? 它是80位填充到128还是实际的128位?

如果前者除了去gmp之外还有其他选择来实现真正的128精度吗?

5 个答案:

答案 0 :(得分:9)

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

四核或扩展四倍精度的软件实现可能受益于x86-64 64x64 =>但是,128整数乘法指​​令。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

x86不支持比80位更高的精度,但如果你真的需要超过64位的FP算法,你最有可能检查你的数字,而不是用暴力解决问题。

答案 3 :(得分:0)

有一些选择。

  1. 使用double-double来表示四元组。例如,请参阅http://www.codeproject.com/Articles/884606/The-double-double-type。但是,该类型不符合IEEE标准。您可以通过检查其epsilon值不如IEEE标准128位浮点数(1.926E-34)来判断。
  2. 使用真正的IEEE标准128位浮点数。 Microsoft VC ++编译器不提供此类型。英特尔C ++编译器确实提供了一个_Quad类型,虽然它的实现目前还没有完成(没有I / O操作)。
  3. 使用第三方库。我最近创建了一个名为double128的库,它基于英特尔C ++ _Quad,但增加了I / O操作。它适用于Microsoft VC ++。您可以访问http://www.cg-inc.com/Product/Double128了解详情。

答案 4 :(得分:0)

我建议通过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的测试。

请参见instructions to compile boost