2010-10-28 57 views
0

我正在做一些浮點運算,並有精度問題。相同輸入的結果值在兩臺機器上不同。我閱讀@Why can't I multiply a float?的帖子,並閱讀網絡上的其他資料&瞭解到它是與浮點的二進制表示和機器epsilon有關。但是,我想檢查是否有辦法解決這個問題/一些解決C++浮點運算?我正在將float轉換爲unsigned short存儲,並在必要時轉換回來。但是,當我將它轉換回無符號短整型時,精度(至6個小數點)在一臺機器上保持正確,但在另一臺機器上失敗。在C++中有浮點算術問題的解決方案嗎?

//convert FLOAT to short 

unsigned short sConst = 0xFFFF; 

unsigned short shortValue = (unsigned short)(floatValue * sConst); 

//Convert SHORT to FLOAT 

float floatValue = ((float)shortValue/sConst); 
+2

究竟是什麼問題?事實上,乘法結果在兩臺不同的機器上稍有不同,這本身並不是問題。爲什麼它構成你的一個? – 2010-10-28 14:50:34

+0

由於沒有提到實際問題,因此無法正確回答此問題。投票結束,這不是一個真正的問題。 – 2010-10-28 15:59:09

+0

更新了問題! – 2010-10-28 16:08:07

回答

2

一個short必須至少爲16位,並且在很多實現中都是如此。一個unsigned 16位short將保持從0到65535的值。這意味着一個短不會完整的五位數的精度,當然不是六個。如果你想要六位數字,你需要20位。

因此,任何精度損失都可能是由於您試圖將六位數字的精度打包到少於五位的數字。沒有解決方案,除了使用可能需要儘可能多的存儲作爲float的整數類型。

我不知道爲什麼它似乎在一個給定的系統上工作。你們兩個使用相同的數字嗎?有沒有人使用過舊的浮點系統,並且巧合地給出了你所期望的樣本結果?是否可能使用比其他更大的short

1

如果要使用本機浮點類型,你能做的最好的是斷言輸出的值由您的程序做與一組參考值沒有太大差別。

「太多」的確切定義完全取決於您的應用程序。例如,如果您在不同的平臺上計算a + b,則應該發現兩個結果在對方的機器精度之內。另一方面,如果你正在做一些像矩陣求逆那樣更復雜的事情,結果很可能會與機器精度相差甚遠。確切地確定你可以期望結果彼此之間有多接近是一個非常微妙和複雜的過程。除非您確切知道自己在做什麼,否則確定應用程序下游所需的精度數量可能更安全(更安全),並驗證結果是否足夠精確。

要獲取有關如何計算的相對誤差兩個浮點值之間的強勁,看到這個答案,浮點導聯其中一個想法:

Floating point comparison functions for C#

+0

謝謝菲利普的答案!更新了問題 – 2010-10-28 16:09:02

0

而不是使用0xFFFF使用它的一半,即32768進行轉換。 32768(0x8000)具有1000000000000000的二進制表示,而0xFFFF具有1111111111111111的二進制表示。0x8000的二進制表示清楚地表明,在轉換期間(在轉換回浮動時縮短(或))divsion操作不會改變精度值零後。對於單面轉換,無論如何OxFFFF是更可取的,因爲它導致更準確的結果。