【发布时间】:2011-05-12 17:54:07
【问题描述】:
这个问题源于我在进一步调查this question 后注意到的一些奇怪的事情......
我一直认为 MATLAB 变量默认为 double-precision。因此,如果我要执行类似声明小数点后 20 位的变量之类的操作:
>> num = 2.71828182845904553488;
>> class(num) % Display the variable type
ans =
double
我希望最后 4 位数字被忽略,因为 floating-point relative accuracy 大约为 10-16:
>> eps(num)
ans =
4.440892098500626e-016
如果我尝试显示小数点后超过 16 位的数字(使用 fprintf 或 sprintf),我会得到预期的结果:
>> fprintf('%0.20f\n', num)
2.71828182845904550000
>> sprintf('%0.20f', num)
ans =
2.71828182845904550000
换句话说,数字 17 到 20 都是 0。
但是当我将num 传递给Symbolic Toolbox 中的variable precision arithmetic function 时,事情变得很奇怪,告诉它使用21 位精度来表示数字:
>> vpa(num, 21)
ans =
2.71828182845904553488
什么?!最后 4 位数字又出现了!当我输入的原始数字存储为双精度变量num 时,它们不应该丢失吗?由于num 传递给vpa 时是双精度变量,那么vpa 怎么知道它们是什么?
我对正在发生的事情的最佳猜测是,MATLAB 在内部表示 num 的精度比双精度更高,因为我将它初始化为一个数字,其小数点后的位数比双精度变量可以处理的多。这真的是正在发生的事情,还是发生了其他事情?
奖励:如果您还没有上述偏头痛,这里还有一个令人困惑的来源......
>> num = 2.71828182845904553488; % Declare with 20 digits past the decimal
>> num = 2.718281828459045531; % Re-declare with 18 digits past the decimal
>> vpa(num, 21)
ans =
2.71828182845904553488 % It's the original 20-digit number!!!
【问题讨论】:
标签: variables matlab floating-point precision