你应该知道有两个密切相关的问题(
In MATLAB, are variables REALLY double-precision by default?和
Why is 24.0000 not equal to 24.0000 in MATLAB?),但其中任何一个都没有完全涵盖这个问题……
当您计算给定有效数字和floating-point value的指数的十进制等效值时,您可以根据需要计算出任意数量的小数位数,但是floating-point relative accuracy之外的任何位置最终都没有实际值,通常甚至不显示.但是,在将精度较低的数字转换为更高精度的数字时,它们似乎在这里发挥作用.
让我们看一下x_s的值,因为它正常显示(仅显示有效数字)以及vpa将如何显示它(具有任意数字的位数):
>> x_s = single(3.2530601) % Create a single-precision number
x_s =
single
3.2530601
>> eps(x_s) % Floating-point relative accuracy
ans =
single
2.3841858e-07
>> vpa(x_s, 16) % Show 16 digits of precision, way more than the relative accuracy
ans =
3.253060102462769
>> x_d = double(x_s) % Convert to double-precision
x_d =
3.253060102462769
看那个!来自vpa的数字与转换为双精度时获得的数字相匹配.看起来,当从单个转换为双精度时,MATLAB会计算较低精度值的十进制等效值,以及较高精度值的位数,并使用它来初始化它.