为什么2 ^ 52在Matlab中等于2 ^ 52 + 1?以及如何解决它?

时间:2017-02-22 07:11:58

标签: matlab

由于某种原因,2 ^ 52在Matlab中等于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

编辑:这不是重复,与浮点错误无关。

1 个答案:

答案 0 :(得分: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)