【发布时间】:2018-09-13 22:14:33
【问题描述】:
假设您想知道一个数字的第一个W 有效数字,比如pi,使用vpa。简单地用那么多数字调用vpa是行不通的。考虑以下带有W = 35 的示例:
>> disp(vpa(sym('pi'), 35))
3.1415926535897932384626433832795029
这不起作用的原因是四舍五入。具体来说,上面的结果似乎表明 pi 的第 35-th 有效数字是 9,而实际上它是四舍五入的 8:
>> disp(vpa(sym('pi'), 36))
3.14159265358979323846264338327950288
从上面看来,一个解决方案似乎是要求一个额外的小数并将其丢弃,这样最后一个幸存的小数就不会出现舍入问题。但这也不在一般情况下起作用,因为四舍五入会导致进位。在 Matlab 中查看这个例子:
>> disp(vpa(sym('pi'), 79))
3.141592653589793238462643383279502884197169399375105820974944592307816406286209
>> disp(vpa(sym('pi'), 80))
3.141592653589793238462643383279502884197169399375105820974944592307816406286209
>> disp(vpa(sym('pi'), 81))
3.141592653589793238462643383279502884197169399375105820974944592307816406286209
>> disp(vpa(sym('pi'), 82))
3.141592653589793238462643383279502884197169399375105820974944592307816406286208999
>> disp(vpa(sym('pi'), 83))
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986
或八度:
>> disp(vpa(sym('pi'), 79))
3.141592653589793238462643383279502884197169399375105820974944592307816406286209
>> disp(vpa(sym('pi'), 80))
3.1415926535897932384626433832795028841971693993751058209749445923078164062862090
>> disp(vpa(sym('pi'), 81))
3.14159265358979323846264338327950288419716939937510582097494459230781640628620900
>> disp(vpa(sym('pi'), 82))
3.141592653589793238462643383279502884197169399375105820974944592307816406286208999
>> disp(vpa(sym('pi'), 83))
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986
可以看出,
- 在
vpa中将所需小数位数从79增加到80或81在 Matlab 中给出相同的答案,因为四舍五入和进位使最后一位数字为零,而 Matlab 修剪尾随零。 - 八度不修剪,所以它显示那些零,但它们仍然不正确。
因此,无论是在 Matlab 中还是在 Octave 中,正确获取第一个 79 有效数字都需要在这种情况下要求至少 三个额外的数字。
以上例子说明了这一点
-
vpa的最后几位可能因为四舍五入而丢失; - 要求一个额外的数字并不总是足够的;
- 避免舍入问题所需的额外位数可以任意大。当想要的数字后面有很长的 9 时,就会发生这种情况。
那么,有没有办法获得一个数字的第一个 W 有效数字,并保证它们是正确的,即不受舍入问题的影响?
【问题讨论】:
标签: matlab octave symbolic-math arbitrary-precision