更精确的浮点数据类型比双倍?

时间:2013-03-27 13:11:12

标签: c++ types

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

4 个答案:

答案 0 :(得分:8)

根据维基百科,80位“Intel”IEEE 754 extended-precision long double,80位填充到内存中的16个字节,有64位尾数,没有隐含位,它可以帮到你19.26十进制数字。这是long double几年来几乎普遍的标准,但最近事情已经开始发生变化。

较新的128位quad-precision格式有112个尾数位加一个隐含位,可以得到34个十进制数字。 GCC将此实现为__float128类型,并且(如果内存提供)编译器选项以将long double设置为它。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

您可能需要考虑操作序列,即首先以最小值开始的有序序列中添加。这将使用尾数中相同的精度来提高结果的整体精度:

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

重点是,向大数字添加小数字会使它们消失。所以后一种方法减少了数值误差

答案 3 :(得分:0)

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

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