In MATLAB, are variables REALLY double-precision by default?
This question arose out of something strange that I noticed after investigating this question further...
I always understood MATLAB variables to be double-precision by default. So, if I were to do something like declare a variable with 20 digits after the decimal point:
>> num = 2.71828182845904553488;
>> class(num) % Display the variable type
ans =
double
I would expect the last 4 digits to be ignored, since the floating-point relative accuracy is on the order of 10-16:
>> eps(num)
ans =
4.440892098500626e-016
If I try to display the number with more than 16 digits after the decimal point (using either fprintf
or sprintf
), I get what I expect to see:
>> fprintf('%0.20f
', num)
2.71828182845904550000
>> sprintf('%0.20f', num)
ans =
2.71828182845904550000
In other words, digits 17 through 20 are all 0.
But things get weird when I pass num
to the variable precision arithmetic function in the Symbolic Toolbox, telling it to represent the number using 21 digits of precision:
>> vpa(num, 21)
ans =
2.71828182845904553488
WHAT?! Those last 4 digits have reappeared! Shouldn't they have been lost when the original number I entered was stored as a double-precision variable num
? Since num
is a double-precision variable when it is passed to vpa
, how did vpa
know what they were?
My best guess as to what is happening is that MATLAB internally represents num
with more precision than a double since I initialized it to a number with more digits past the decimal point than a double-precision variable could handle. Is this really what is happening, or is something else going on?
BONUS: And here's an additional source of confusion if you don't already have a migraine from the above...
>> 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!!!