2017-02-22 86 views
4

出于某种原因,2^52在Matlab中等于2^52 + 1,但是为什么?我该如何解决这个问题?欲了解更多信息,请运行下面的代码并检查结果。为什么在Matlab中2^52等于2^52 + 1?以及如何解决它?

这是输出(与VPA):

>> format long 
>> digits(500) 
>> vpa(2^52) 

ans = 

4503599627370496.0 

>> vpa(2^52+1) 

ans = 

4503599627370496.0 

>> isequal(vpa(2^52), vpa(2^52+1)) 

ans = 

    1 

>> vpa(2^52+1) 

ans = 

4503599627370496.0 

>> ans+1 

ans = 

4503599627370497.0 

>> vpa(2^52+1000) 

ans = 

4503599627371496.0 

https://ibb.co/iDDAwF

(没有的VPA输出)

>> 2^52 

ans = 

    4.503599627370496e+015 

>> 2^52+1 

ans = 

    4.503599627370497e+015 

>> isequal(2^52, 2^52+1) 

ans = 

    0 

>> 2^52+1 

ans = 

    4.503599627370497e+015 

>> ans+1 

ans = 

    4.503599627370498e+015 

>> 2^52+1000 

ans = 

    4.503599627371496e+015 

编辑:这是不是重复和无关处理浮点错误。

+0

那奇。我只是运行matlab中的所有命令,并获得所有预期的答案 – RSon1234

+0

请不要将图片发布到代码中。这是很难复制。那么,什么是'vpa'?我的Matlab没有它。 – Bernhard

+0

@Bernhard它是可变精度算术 – RSon1234

回答

7
vpa_item=vpa('2^52'); 
vpa_item2=vpa('1+2^52'); 
disp(isequal(vpa_item, vpa_item2)); 

导致0

可以使用"symbolic expressions"绕过的输入端有限或浮点运算的限制。

- 编辑 -

所链接的页面说 vpa(1+sym(2)^52)是范式表达,尽管这两种方法应该工作。

什么不会(一般)工作

value_affected_by_imprecise_arithemetic = 1+2^52; 
vpa(value_affected_by_imprecise_arithemetic) 
+0

所以你知道为什么我这样做得到正确的结果,因为OP做的和OP得到不正确的结果? – RSon1234

+0

@ RSon1234因此,在R2015a中,isequal(vpa(2^52),vpa(2^52 + 1))产生'0',这是正确的行为。也许是由于版本不匹配? idk ... – Mikhail

+0

@Mikhail我刚刚测试了'isequal(vpa(num2str(2^52)),vpa(num2str(2^52 + 1)))',它的工作,谢谢。 – Kitiara

相关问题