从单精度中减去双精度得到0.而不是我想要的

时间:2016-02-04 23:44:06

标签: octave precision single-precision

我正在尝试使用Octave检查与sin(x)相关的舍入误差我得到这些数字:

>> single(sin(10))
ans = -0.544021129608154

>> sin(10)
ans = -0.544021110889370

>> (single(sin(10))) - (sin(10))
ans = 0

应该是: -1.8718784×10 ^ -8

我输入:format long但它仍然给我零,我不知道如何得到实际答案。

2 个答案:

答案 0 :(得分:3)

这适用于MATLAB 2014。

>> single(sin(10))-sin(10)

ans =

 -1.8719e-08

请尝试double(single(sin(10)))-sin(10)吗?但我不知道为什么你的结果不起作用。

(注意:这篇文章最初被标记为MATLAB,这就是为什么我说它很奇怪。)

答案 1 :(得分:3)

在single和double之间执行计算时,返回值将具有最低精度的类。这意味着当你做

single (sin (10)) - sin (10)

你的结果将是单一的。注意,对于不同整数类型之间的操作,这是相同的;你会得到一个精度较低的那个。这意味着在减法发生之前,你的double也会被转换成单身。

从其他答案来看,似乎Matlab实际上用双精度执行计算。这很奇怪,因为Matlab也会返回像Octave这样的单曲。它必须将单个转换为double,以double形式执行计算,并将其转换为单个。无论如何,我已经报告了Octave bug的Matlab兼容性。