Matlab单转换为双转换错误

时间:2018-02-21 17:04:35

标签: matlab casting floating-point double precision

有人知道为什么在Matlab(R2016a)中对单精度浮点数进行转换double()会改变最后的数字吗?这是一个例子:

format 'long'
x=3.2530601; %arbitrary single precision number
x_s=single(x);
x_d=double(x_s);

如果我查看变量的类和值,我可以看到以下内容: xx_d是双打,x_s是预期的单身。值为:

x=3.253060100000000
x_s=3.2530601
x_d=3.253060102462769

由于数字3.2530601可以表示为双精度浮点数或单精度浮点数,因此我不明白为什么xx_d不相同。它们比x+eps(x)更远。我想也许Matlab尝试通过有理分数近似来计算双精度x_d,但是调用rat(x,16)并不会给出与x_d相同的结果。我很无能为力。有谁知道这里发生了什么?

1 个答案:

答案 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会计算较低精度值的十进制等效值,以获得较高精度值的位数,并将其用于初始化它。