2016-02-04 81 views
3

我試圖使用檢查用八度的sin(x)相關聯的舍入誤差,我得到這些數字:減去單精度雙精度給我0不是我想要的

>> 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

你應該真的把它標記爲Octave而不是MATLAB;這似乎是一個只有八度的問題。 – beaker

回答

3

這在MATLAB 2014年對我的作品

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

ans = 

-1.8719e-08 

嘗試double(single(sin(10)))-sin(10),而不是可能?但我不知道你的結果爲什麼不起作用。

(注:這篇文章最初是標記MATLAB,這就是爲什麼我說這件事很奇怪)

+0

我得到的結果與Octave中的OP相同,但是您的解決方法提供了正確的結果。 (我自己也在研究相同的解決方案。):) – beaker

+0

我使用八度,所以也許這就是爲什麼我得到零,但我認爲它會是相同的。希望是問題所在。謝謝。 – user35053

3

在執行單,雙間計算,則返回值將與最低精度的類。這意味着當你做

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

你的結果將是類單。請注意,這對於不同整數類型之間的操作是相同的;你會得到一個精度較低的。這意味着,在減法發生之前,您的雙倍也會投射到單一。

從其他答案看來,Matlab似乎實際上用雙打來執行計算。這很奇怪,因爲Matlab也會返回一個像Octave一樣的單個。它必須將單數轉換爲雙精度,執行雙精度計算,並將其轉換爲單精度。無論如何,我已經報告了一個用於Matlab兼容性的Octave bug