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

Coo*_*der 9 c++ types

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

Pot*_*ter 9

根据维基百科的说法,80位"Intel"IEEE 754 扩展精度 long double,即80位填充到内存中的16个字节,有64位尾数,没有隐含位,可以得到19.26十进制数字.这几乎是几乎普遍适用的标准long double,但最近事情已经开始发生变化.

较新的128位四精度格式有112个尾数位加一个隐含位,可以得到34个十进制数字.GCC将此作为__float128类型实现,并且(如果内存服务)有一个编译器选项来设置long double它.


ogn*_*i42 6

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

1e00 + 1e-16 + ... + 1e-16 (1e16 times) = 1e00
1e-16 + ... + 1e-16 (1e16 times) + 1e00 = 2e00
Run Code Online (Sandbox Code Playgroud)

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