【问题标题】:x86-64 long double precisionx86-64 long 双精度
【发布时间】:2010-05-10 00:11:34
【问题描述】:

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

如果是前者,除了gmp,还有其他选择可以达到真正的128精度吗?

【问题讨论】:

  • 关于整数,使用 __int128_t__uint_128_t "types" 的 gcc 可以使用 128 位精度算术。
  • 对于 fp (gcc > 4.5) 有 __float128 software-emulated-floating-point

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


【解决方案1】:

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

不过,quad 或扩展 quad 精度的软件实现可能会受益于 x86-64 64x64 => 128 整数乘法指​​令。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      x86 不支持高于 80 位的精度,但如果您确实需要超过 64 位的 FP 算法,您很可能应该检查您的数值,而不是用蛮力解决问题。

      【讨论】:

      • 我正在比较使用不同精度和结果的准确度。
      • 你有没有观察到这样的行为? GCC,至少,我认为不能禁止发射 x87。
      • Potatoswatter:试试-msse2 -mfpmath=sse,这应该会导致它对doublefloat s 使用SSE 指令——尽管它可能仍然对long double s 使用x87 指令。
      • Microsoft 编译器都发出标量 SSE2。 x87 在 Windows 上已弃用 x64 程序。我很确定 GCC 也会这样做,因为它也更快,并且 x64 CPU 保证支持 SSE2。但可能存在它仍然发出 x87 for long double 的情况。
      • x86-64 ABI (x86-64.org/documentation/abi.pdf) 实际上指定 long double 是 x87 的 80 位扩展精度格式。
      【解决方案4】:

      我推荐 Boost 包装器而不是 MPFR 或 GMP:

      提升 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-12
        • 2010-10-19
        • 1970-01-01
        • 2020-11-11
        • 2021-12-14
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        相关资源
        最近更新 更多