【问题标题】:subtracting double precision from single precision gives me 0. not what I want从单精度中减去双精度给我 0。不是我想要的
【发布时间】:2016-05-14 19:43:37
【问题描述】:

我正在尝试使用 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,但它仍然给我零,我不知道如何获得实际答案。

【问题讨论】:

  • 你真的应该把它标记为 Octave 而不是 MATLAB;这似乎是一个仅 Octave 的问题。

标签: octave precision single-precision


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    这在 MATLAB 2014 中适用于我。

    >> single(sin(10))-sin(10)
    
    ans =
    
     -1.8719e-08
    

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

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

    【讨论】:

    • 我得到的结果与 Octave 中的 OP 相同,但是您的解决方法给出了正确的结果。 (我自己也在研究同样的解决方案。):)
    • 我正在使用八度音阶,所以也许这就是我得到零的原因,但我认为它会是一样的。希望这就是问题所在。谢谢。
    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多