为数组中的浮点值选择比例,对算术精度有影响吗
Picking a scale for floating point values in an array, does it matter for precision of arithmetic
我有大量浮点值,其大小差异很大。它是否有助于为精确目的重新缩放 [0,1] 中的那些(例如,如果我想对数组执行算术运算)?如果我这样做,我可以想到较小的值会被截断,但另一方面,较小的值不会对绝对误差产生太大影响。如果我对已计算值的数组进行重新缩放,我相信这只会让事情变得更糟,因为我只会引入额外的舍入误差。另一方面,我相信如果在生成所述值时涉及缩放比例,我可以减少错误。
我主要指的是连续误差之间的绝对距离对于后续间隔中的值增长 2 倍(即 [0,1) 与 [1,2) 与 [2,4] 等)。我在当前上下文中是否正确解释了这一点?当尝试渲染一个大规模缩放的 3D 场景时,我已经看到了由于大缩放引起的浮点错误的这种影响,而不是它的较小缩放版本(当 3D space 中的相机离原点太远时,会出现类似的效果,因为浮动之间的绝对距离变大)。
考虑到上述情况,是否有最佳方法来为我计划生成的值数组选择比例因子(前提是我知道在不缩放的情况下的最小值和最大值)。我正在考虑只生成它以便所有值都在 [0,1] 范围内,但是我担心最小元素的截断可能是一个问题。是否存在基于最大和最小元素的已知试探法,这些试探法允许找到半最优重新缩放精度。在一个不相关的说明中,我知道 Kahan 求和算法及其变体,我确实将它用于所述数组的求和。我的问题是选择比例是否可以进一步提供帮助,或者这无关紧要?
以二进制浮点格式按 2 的幂缩放(或者,通常,按 base-b[=48= 中的 b 的幂缩放] 浮点格式)只要结果保持在正常指数范围内就没有错误。即对于任意x,计算x•b[的结果=29=]e 与 x 有相同的尾数,只要 x•be属于正常范围。
同样,只要结果保持在正常范围内,加、减、乘和除缩放数字的运算产生的结果与对保持在正常范围内的未缩放数字的相同运算产生的有效数字相同。未缩放操作中出现的任何舍入误差与缩放操作中的舍入误差相同,由比例调整。
因此,按 b 的幂缩放数字,执行相同的操作并撤消缩放不会改善或改变浮点舍入误差。 (请注意,乘法和除法会影响缩放比例,这可以在每次操作后、所有操作后或定期进行补偿。例如,给定 X = x*16
和 Y = y*16
,X*Y
将等于 x*16*y*16
= x*y*256
。因此撤消其缩放比例需要除以 256 而不是 16。)
如果使用其他运算,舍入误差可能会有所不同。例如,如果执行平方根并且其操作数中的缩放比例不是 b 的偶次幂,则其结果将包括不是 [=29= 整数幂的缩放比例]b,所以尾数必须与相应的未缩放结果的尾数不同,这就允许舍入误差不同。
当然,如果正弦、余弦或其他三角函数用于缩放数字,将获得截然不同的结果,因为这些函数未按要求的方式缩放 (f(x•s)一般不等于f(x)•s)。但是,如果正在缩放的数字表示 space 中的点,则它们之间计算的任何角度在缩放和未缩放的实现中都是相同的。也就是说,计算出的角度不会缩放,因此应用三角函数会产生相同的结果。
如果任何中间结果在缩放或未缩放计算中超出正常指数范围,则可能会产生不同的尾数。这包括结果低于正规但未下溢为零的情况——低于正规的结果可能具有截断的有效数字,因此与产生正常范围内的结果的不同尺度计算相比,一些信息丢失。
缩放的替代方法可能是平移。当处理来自原点的点时,坐标可能很大,并且浮点分辨率相对于点之间的距离可能很大。如果将点平移到原点附近(从每个坐标中减去固定量 [每个维度固定]),它们之间的几何关系将保留,但坐标将处于浮点格式的更精细范围内。这可以改善发生的浮点舍入错误。
我有大量浮点值,其大小差异很大。它是否有助于为精确目的重新缩放 [0,1] 中的那些(例如,如果我想对数组执行算术运算)?如果我这样做,我可以想到较小的值会被截断,但另一方面,较小的值不会对绝对误差产生太大影响。如果我对已计算值的数组进行重新缩放,我相信这只会让事情变得更糟,因为我只会引入额外的舍入误差。另一方面,我相信如果在生成所述值时涉及缩放比例,我可以减少错误。
我主要指的是连续误差之间的绝对距离对于后续间隔中的值增长 2 倍(即 [0,1) 与 [1,2) 与 [2,4] 等)。我在当前上下文中是否正确解释了这一点?当尝试渲染一个大规模缩放的 3D 场景时,我已经看到了由于大缩放引起的浮点错误的这种影响,而不是它的较小缩放版本(当 3D space 中的相机离原点太远时,会出现类似的效果,因为浮动之间的绝对距离变大)。
考虑到上述情况,是否有最佳方法来为我计划生成的值数组选择比例因子(前提是我知道在不缩放的情况下的最小值和最大值)。我正在考虑只生成它以便所有值都在 [0,1] 范围内,但是我担心最小元素的截断可能是一个问题。是否存在基于最大和最小元素的已知试探法,这些试探法允许找到半最优重新缩放精度。在一个不相关的说明中,我知道 Kahan 求和算法及其变体,我确实将它用于所述数组的求和。我的问题是选择比例是否可以进一步提供帮助,或者这无关紧要?
以二进制浮点格式按 2 的幂缩放(或者,通常,按 base-b[=48= 中的 b 的幂缩放] 浮点格式)只要结果保持在正常指数范围内就没有错误。即对于任意x,计算x•b[的结果=29=]e 与 x 有相同的尾数,只要 x•be属于正常范围。
同样,只要结果保持在正常范围内,加、减、乘和除缩放数字的运算产生的结果与对保持在正常范围内的未缩放数字的相同运算产生的有效数字相同。未缩放操作中出现的任何舍入误差与缩放操作中的舍入误差相同,由比例调整。
因此,按 b 的幂缩放数字,执行相同的操作并撤消缩放不会改善或改变浮点舍入误差。 (请注意,乘法和除法会影响缩放比例,这可以在每次操作后、所有操作后或定期进行补偿。例如,给定 X = x*16
和 Y = y*16
,X*Y
将等于 x*16*y*16
= x*y*256
。因此撤消其缩放比例需要除以 256 而不是 16。)
如果使用其他运算,舍入误差可能会有所不同。例如,如果执行平方根并且其操作数中的缩放比例不是 b 的偶次幂,则其结果将包括不是 [=29= 整数幂的缩放比例]b,所以尾数必须与相应的未缩放结果的尾数不同,这就允许舍入误差不同。
当然,如果正弦、余弦或其他三角函数用于缩放数字,将获得截然不同的结果,因为这些函数未按要求的方式缩放 (f(x•s)一般不等于f(x)•s)。但是,如果正在缩放的数字表示 space 中的点,则它们之间计算的任何角度在缩放和未缩放的实现中都是相同的。也就是说,计算出的角度不会缩放,因此应用三角函数会产生相同的结果。
如果任何中间结果在缩放或未缩放计算中超出正常指数范围,则可能会产生不同的尾数。这包括结果低于正规但未下溢为零的情况——低于正规的结果可能具有截断的有效数字,因此与产生正常范围内的结果的不同尺度计算相比,一些信息丢失。
缩放的替代方法可能是平移。当处理来自原点的点时,坐标可能很大,并且浮点分辨率相对于点之间的距离可能很大。如果将点平移到原点附近(从每个坐标中减去固定量 [每个维度固定]),它们之间的几何关系将保留,但坐标将处于浮点格式的更精细范围内。这可以改善发生的浮点舍入错误。