簡體   English   中英

在C ++中有浮點算術問題的解決方案嗎?

[英]Is there a solution for Floating point Arithmetic problems in C++?

我正在做一些浮點運算,並且有精度問題。 對於相同的輸入,兩台機器上的結果值不同。 我讀了帖子@ 為什么我不能乘一個浮點數? 並且還閱讀了網上的其他資料,並了解它與浮點數的二進制表示形式以及機器epsilon上的內容有關。 但是,我想檢查是否有解決此問題的方法/ C ++中的浮點算術可以解決? 我正在將浮點數轉換為存儲的無符號縮寫,並在必要時進行轉換。 但是,當我將其轉換回無符號的short時,在一台機器上的精度(至6個小數點)仍然正確,但在另一台機器上卻失敗了。

//convert FLOAT to short

unsigned short sConst = 0xFFFF;

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

//Convert SHORT to FLOAT

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

short必須至少為16位,並且在很多實現中都是這樣。 一個unsigned 16位short可以保存0到65535之間的值。這意味着short不能保存完整的5位精度,當然也不能容納6位精度。 如果要六位數,則需要20位。

因此,任何精度損失都可能是由於您試圖將六位數的精度打包成少於五位數的事實。 除了使用可能需要與float一樣多的存儲的整數類型外,沒有其他解決方案。

我不知道為什么它似乎可以在一個給定的系統上運行。 您在兩個上都使用相同的數字嗎? 是否有人使用較舊的浮點系統,而巧合地給出了您在嘗試的樣本中所期望的結果? 它可能使用比另一個更大的short嗎?

如果要使用本機浮點類型,則最好的辦法是聲明程序輸出的值與一組參考值相差不大。

“太多”的精確定義完全取決於您的應用程序。 例如,如果您在不同的平台上計算a + b ,則應發現兩個結果在機器精度之間。 另一方面,如果您正在做一些更復雜的事情(例如矩陣求逆),那么結果的差異很可能會超過機器精度。 精確確定結果之間的距離是一個非常微妙而復雜的過程。 除非您確切地知道自己在做什么,否則確定應用程序下游所需的精確度並驗證結果是否足夠精確可能會更安全(更精明)。

要了解如何穩健地計算兩個浮點值之間的相對誤差,請參閱此答案和鏈接在其中的浮點指南:

C#的浮點比較功能

而不是使用0xFFFF,而是使用它的一半,即32768進行轉換。 32768(Ox8000)的二進制表示形式為1000000000000000,而OxFFFF的二進制表示形式為1111111111111111。Ox8000的二進制表示形式明確表示,轉換期間的乘法和除法運算(轉換為short(或轉換為float時))不會更改精度值零后。 對於單面轉換,但是OxFFFF是優選的,因為它可以導致更准確的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM