有人知道为什么在Matlab(R2016a)中对单精度浮点数进行转换double()
会改变最后的数字吗?这是一个例子:
format 'long'
x=3.2530601; %arbitrary single precision number
x_s=single(x);
x_d=double(x_s);
如果我查看变量的类和值,我可以看到以下内容:
x
和x_d
是双打,x_s
是预期的单身。值为:
x=3.253060100000000
x_s=3.2530601
x_d=3.253060102462769
由于数字3.2530601
可以表示为双精度浮点数或单精度浮点数,因此我不明白为什么x
和x_d
不相同。它们比x+eps(x)
更远。我想也许Matlab尝试通过有理分数近似来计算双精度x_d
,但是调用rat(x,16)
并不会给出与x_d
相同的结果。我很无能为力。有谁知道这里发生了什么?
答案 0 :(得分:6)
您应该注意两个密切相关的问题(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
的数字与转换为双精度时获得的数字相匹配。看起来,当从single
转换为double
时,MATLAB会计算较低精度值的十进制等效值,以获得较高精度值的位数,并将其用于初始化它。