出于某种原因,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
Run Code Online (Sandbox Code Playgroud)
(没有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
Run Code Online (Sandbox Code Playgroud)
编辑:这不是重复,与浮点错误无关.
vpa_item=vpa('2^52');
vpa_item2=vpa('1+2^52');
disp(isequal(vpa_item, vpa_item2));
Run Code Online (Sandbox Code Playgroud)
结果是 0
您可以使用"符号表达式"来绕过输入端的有限或浮点运算的限制.
- 编辑 -
链接页面说的
vpa(1+sym(2)^52)
是范例表达,尽管两种方法都应该有效.
什么是不起作用(一般)是
value_affected_by_imprecise_arithemetic = 1+2^52;
vpa(value_affected_by_imprecise_arithemetic)
Run Code Online (Sandbox Code Playgroud)