最佳答案
这个问题出现了一些奇怪的东西,我注意到后,研究 这个问题进一步..。
我总是理解 MATLAB 变量默认为 双精度。所以,如果我要声明一个小数点后面有20个数字的变量:
>> num = 2.71828182845904553488;
>> class(num) % Display the variable type
ans =
double
我希望最后4位数字被忽略,因为 浮点相对精度浮点相对精度的顺序是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
传递给 符号工具箱中的 可变精度算术函数,告诉它用21位的精度来表示数字时,事情就变得奇怪了:
>> vpa(num, 21)
ans =
2.71828182845904553488
什么? !最后四位数字又出现了!当我输入的原始数字被存储为双精度变量 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!!!