【问题标题】:More Precise Floating point Data Types than double?比 double 更精确的浮点数据类型?
【发布时间】:2013-03-28 23:20:18
【问题描述】:

在我的项目中,我必须在 double 元素的矩阵上计算除法、乘法、减法和加法。 问题是当矩阵的大小增加时,我的输出的准确性会受到极大的影响。 目前,我对每个元素使用double,我认为这些元素使用内存的8 bytes,并且无论小数位如何,其精度都为16 digits。 即使对于大尺寸的矩阵,所有元素占用的内存也在几千字节的范围内。所以我可以负担得起使用需要更多内存的datatypes。 所以我想知道哪种数据类型比double 更精确。 我尝试在一些书籍中搜索,我可以找到long double。 但我不知道它的精度是多少。 如果我想要比这更高的精度怎么办?

【问题讨论】:

  • 查看 GMP 项目。还有一些方法可以最大限度地减少计算中的舍入误差。
  • 如果你可以依赖外部依赖,Boost 1.53 有一个多精度库可以帮助你!!
  • 使用一点代数重新排列数学计算有助于减少舍入误差
  • 切换到更大的类型只会延迟数字崩溃。为了完全避免它,请翻开一本数值分析书,阅读“稳定性”一章。
  • 数值崩溃是您遇到的现象:舍入错误累积并导致错误答案。

标签: c++ types


【解决方案1】:

根据 Wikipedia,80 位“英特尔”IEEE 754 extended-precisionlong double,即 80 位填充到内存中的 16 个字节,具有 64 位尾数,没有隐式位,即 19.26 个十进制数字。多年来,这一直是long double 的几乎通用标准,但最近情况开始发生变化。

较新的 128 位 quad-precision 格式具有 112 个尾数位和一个隐式位,即 34 个十进制数字。 GCC 将此实现为 __float128 类型,并且(如果有记忆的话)有一个编译器选项可以将 long double 设置为它。

【讨论】:

  • 那么考虑到速度和准确性之间的权衡,您会在 long double 和 __float128 之间推荐谁?
  • @Cool_Coder 我不知道你的程序有什么特点,不过既然很简单,就两个都试试吧!
  • 好的,我会告诉你的。只是为了它让我知道以下是否不正确:__float128 *nicePrecision = new __float128();
  • 128 位浮点数并不是那么新鲜。它们是 SPARC 上的 long double 类型,它已经存在了很长时间(例如,二十多年)。
  • @PeteBecker 这仍然比 8087 更新很多!除非我弄错了,否则标准化是在 2008 年才出现的。无论如何,我的印象是他们现在正在获得牵引力,因为传统的 80 位硬件大部分已经不复存在了。
【解决方案2】:

您可能需要考虑操作的顺序,即按照从最小值开始的有序顺序进行加法。这将使用尾数中的相同精度提高结果的整体准确性:

1e00 + 1e-16 + ... + 1e-16 (1e16 times) = 1e00
1e-16 + ... + 1e-16 (1e16 times) + 1e00 = 2e00

关键是把小数加到大数上会使它们消失。所以后一种方法减少了数值误差

【讨论】:

    【解决方案3】:

    精度高于double 的浮点数据类型将取决于您的编译器和架构。

    为了获得超过double 的精度,您可能需要依赖一些支持任意精度计算的数学库。不过这些可能不会很快。

    【讨论】:

    • “这些可能不够快”
    • 您似乎忽略了long double 的存在。同样的问题确实适用,但程度要小得多。
    • @us2012 我刚才说可能不会很快,不够快。所以是的,这在很大程度上取决于 OP 试图做什么。如果我知道的话,我会推荐一个数学库,但我对这种任意精度的经验仅限于其他语言。
    【解决方案4】:

    在英特尔架构上,long double 的精度为 80bits

    你想代表什么样的价值观?也许你最好使用固定精度。

    【讨论】:

    • long float?真的吗? 80 位精度,指数中有多少位?
    • 取决于编译器;对于 MS,long doubledouble 具有相同的精度。
    • 我的意思是长双,这只是一个小故障。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2023-02-22
    • 1970-01-01
    • 2015-02-20
    相关资源
    最近更新 更多