Matlab 双精度与大量项的乘积中正确的小数位数

Matlab 双精度与大量项的乘积中正确的小数位数,matlab,floating-point,numerical,Matlab,Floating Point,Numerical,无理数集N的大小的严格下限是多少,在64位机器上的Matlab中表示为双倍,我在对乘积的k位小数有信心的情况下将其相乘?例如,将~10^12个编码不同随机pi块的双倍数相乘后,我能期望什么样的精度?对于64位浮点数,假设标准IEEE 754有52+1位尾数 这意味着相对精度介于1.0000…0和1.0000…1之间,其中小数点后的二进制位数为52。(您可以将1.000…0想象为尾数(也称为有效位)中以二进制形式存储的内容) 误差为52的1/2次方除以2(分辨率的一半)。注:我选择的相对精度尽可能

无理数集N的大小的严格下限是多少,在64位机器上的Matlab中表示为双倍,我在对乘积的k位小数有信心的情况下将其相乘?例如,将~10^12个编码不同随机pi块的双倍数相乘后,我能期望什么样的精度?

对于64位浮点数,假设标准IEEE 754有52+1位尾数

这意味着相对精度介于1.0000…0和1.0000…1之间,其中小数点后的二进制位数为52。(您可以将1.000…0想象为尾数(也称为有效位)中以二进制形式存储的内容)

误差为52的1/2次方除以2(分辨率的一半)。注:我选择的相对精度尽可能接近1.0,因为这是最坏的情况(否则在1.111..11和1.111..01之间,精度更高)

在十进制中,双精度的最差情况相对精度为1.11E-16

如果使用该精度乘以N倍,则新的相对精度(假设中间舍入没有额外误差)为:

因此,如果将pi(或任何双精度10^12)乘以,则误差上限为:

1.1102e-004
2.22e-004
这意味着您可以对大约4-5位数字有信心

如果CPU支持中间结果的扩展精度浮点数,则可以忽略中间舍入错误

如果没有使用扩展精度FPU(浮点单位),中间步骤中的舍入会引入额外的错误(与乘法相同)。这意味着严格的下限计算为:

1 -
((1 - 1.11E-16) * (1 - 1.11E-16) * (1 - 1.11E-16)
                * (1 - 1.11E-16) * (1 - 1.11E-16) % for multiplication, then rounding

               ... (another N-4 lines here) ...

                * (1 - 1.11E-16) * (1 - 1.11E-16))

= 1-(1-1.11E-16)^(N*2-1)

如果N太大,则运行时间太长。可能的误差(中间四舍五入)为2.2204e-012,与不进行中间四舍五入相比,该误差为2.2204e-012的两倍
1-(1-1.11E-16)^N
=1.1102e-012

大约,我们可以说中间舍入使误差加倍

如果将pi乘以10^12倍,则没有扩展精度FPU。这可能是因为您将中间步骤写入内存(或者执行其他操作),在继续之前(只需确保编译器没有对指令重新排序以避免FPU结果累积),那么相对错误的严格上限是:

1.1102e-004
2.22e-004
请注意,对小数位数的信心并不意味着它有时会精确到小数位数

例如,如果答案是:

1.9999999999,误差为1E-5,实际答案可能为2.000001234

在这种情况下,即使是第一个十进制数字也是错误的。但这实际上取决于你有多幸运(答案是否落在这样一个界限上)



此解决方案假设双精度(包括答案)都已标准化。对于非规范化的结果,显然,非规范化的二进制数字的数量将使精度降低那么多位。

对于64位浮点数,假设标准IEEE 754,有52+1位尾数

这意味着相对精度介于1.0000…0和1.0000…1之间,其中小数点后的二进制位数为52。(您可以将1.000…0想象为尾数(也称为有效位)中以二进制形式存储的内容)

误差为52的1/2次方除以2(分辨率的一半)。注:我选择的相对精度尽可能接近1.0,因为这是最坏的情况(否则在1.111..11和1.111..01之间,精度更高)

在十进制中,双精度的最差情况相对精度为1.11E-16

如果使用该精度乘以N倍,则新的相对精度(假设中间舍入没有额外误差)为:

因此,如果将pi(或任何双精度10^12)乘以,则误差上限为:

1.1102e-004
2.22e-004
这意味着您可以对大约4-5位数字有信心

如果CPU支持中间结果的扩展精度浮点数,则可以忽略中间舍入错误

如果没有使用扩展精度FPU(浮点单位),中间步骤中的舍入会引入额外的错误(与乘法相同)。这意味着严格的下限计算为:

1 -
((1 - 1.11E-16) * (1 - 1.11E-16) * (1 - 1.11E-16)
                * (1 - 1.11E-16) * (1 - 1.11E-16) % for multiplication, then rounding

               ... (another N-4 lines here) ...

                * (1 - 1.11E-16) * (1 - 1.11E-16))

= 1-(1-1.11E-16)^(N*2-1)

如果N太大,则运行时间太长。可能的误差(中间四舍五入)为2.2204e-012,与不进行中间四舍五入相比,该误差为2.2204e-012的两倍
1-(1-1.11E-16)^N
=1.1102e-012

大约,我们可以说中间舍入使误差加倍

如果将pi乘以10^12倍,则没有扩展精度FPU。这可能是因为您将中间步骤写入内存(或者执行其他操作),在继续之前(只需确保编译器没有对指令重新排序以避免FPU结果累积),那么相对错误的严格上限是:

1.1102e-004
2.22e-004
请注意,对小数位数的信心并不意味着它有时会精确到小数位数

例如,如果答案是:

1.9999999999,误差为1E-5,实际答案可能为2.000001234

在这种情况下,即使是第一个十进制数字也是错误的。但这实际上取决于你有多幸运(答案是否落在这样一个界限上)


此解决方案假设双精度(包括答案)都已标准化。对于非规范化的结果,显然,非规范化的二进制数将使精度降低那么多位。

假设所有输入值、中间值和最终值都没有下溢或溢出,则所述M操作中的相对误差最多为(1+2-53)M-1

考虑将实数a0转换为双精度。结果是一些数字a0•(1+e),其中-2-53≤ E≤ 2-53(因为转换为双精度应始终产生最接近的可表示值,且