Dav*_*vid 5 floating-point precision double matlab casting
有人知道为什么double()在Matlab(R2016a)中使用单精度浮点数进行投射会改变最后的数字吗?这是一个例子:
format 'long'
x=3.2530601; %arbitrary single precision number
x_s=single(x);
x_d=double(x_s);
Run Code Online (Sandbox Code Playgroud)
如果我查看变量的类和值,我可以看到以下内容:
x并且x_d是双倍的,x_s是预期的单个.价值观是:
x=3.253060100000000
x_s=3.2530601
x_d=3.253060102462769
Run Code Online (Sandbox Code Playgroud)
由于数字3.2530601可以表示为双精度浮点数或单精度浮点数,因此我不明白为什么x和x_d不一样.他们远比x+eps(x).我想也许Matlab试图x_d通过有理分数近似来计算出双精度,但是调用rat(x,16)并没有给出相同的结果x_d.我很无能为力.有谁知道这里发生了什么?
有两个密切相关的问题(在MATLAB中,变量是真正的双精度默认?而且为什么24.0000不等于24.0000在MATLAB? ),你应该知道的,但是这不是相当的或者完全覆盖他们......
当您计算给定有效数字的十进制等效值和浮点值的指数时,您可以根据需要计算出任意数量的小数位数,但超出浮点相对精度的任何位置最终都没有实际值,通常甚至不显示.但是,在将精度较低的数字转换为更高精度的数字时,它们似乎在这里发挥作用.
让我们看看你的价值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
Run Code Online (Sandbox Code Playgroud)
看那个!vpa转换为双精度时,数字匹配得到的数字.看起来,当从a转换single为a时double,MATLAB会计算较低精度值的十进制等效值,以及较高精度值的位数,并使用它来初始化它.
| 归档时间: |
|
| 查看次数: |
416 次 |
| 最近记录: |