如何通过可变精度算术(vpa)准确获取数字的前W位有效数字?
嘿,我碰到过vpa的这个小坑!当你想用它获取π的前W位有效数字时,直接指定W位精度可能会因为舍入操作给你一个“误导性”的结果,我来给你拆解清楚:
为什么用
vpa获取π的前35位有效数字会出错? 现象重现
当你执行以下代码获取π的前35位有效数字时:
>> disp(vpa(sym('pi'), 35)) 3.1415926535897932384626433832795029
你会发现结果的第35位有效数字是9,但实际上π的这一位应该是8。
问题根源:舍入机制
这可不是vpa的bug,而是它的舍入规则导致的:vpa在生成指定精度的数值时,会计算到第W+1位数字,然后根据这一位的大小进行四舍五入。当你指定35位精度时,程序会看第36位数字——π的第36位是8(大于等于5),所以它会把第35位的8向上进1,变成9,最终输出的结果就出现了这个偏差。
验证方法
要确认真实的第35位数字,只需要把精度设置为W+1位(也就是36位):
>> disp(vpa(sym('pi'), 36)) 3.14159265358979323846264338327950288
这时你就能清楚看到,π的第35位确实是8,第36位的8触发了之前的舍入操作,才让35位精度的结果里第35位变成了9。
内容的提问来源于stack exchange,提问作者Luis Mendo
相关产品推荐
相关产品推荐

