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