这个问题是我进一步调查后发现的奇怪问题。
我一直都理解默认情况下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。
但是当我在Symbolic Toolbox中传递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!!!