6

我在寫一段代碼,我必須將其從雙精度值轉換爲浮點值。我正在使用boost :: numeric_cast來執行此轉換,它會提醒我任何溢出/下溢。不過,我也有興趣知道這種轉換是否會導致某些精度損失。當從雙精度轉換爲浮點時檢測精度損失

例如

double source = 1988.1012; 
    float dest = numeric_cast<float>(source); 

主要生產DEST擁有價值1988.1

是否有任何可用的方式,我可以檢測到這種精度損失/四捨五入

+7

在這種情況下,總會有*精確度損失。 – 2010-07-13 17:58:33

回答

11

你可以施放浮動回加倍並且將這個雙倍與原始值進行比較 - 這應該給你一個關於是否失去精度的公平指示。

+4

比公平更好。它會告訴你,是否有任何信息丟失。 – 2010-07-13 18:44:57

9
float dest = numeric_cast<float>(source); 
double residual = source - numeric_cast<double>(dest); 

因此,residual包含您正在尋找的「損失」。

1

看看這些文章爲single precisiondouble precision浮游物。首先,浮點數指數爲8位,雙數爲11位。所以任何大於10^127或小於10^-126的數值都將成爲你所說的溢出。對於浮點數,你有23位的數字的實際數字,52比特的雙。很明顯,你的雙精度比浮點精度要高得多。

假設你有這樣一個數字:1.1123。這個數字實際上可能不會被編碼爲1.1123,因爲浮點數字中的數字被用來實際加起來作爲分數。例如,如果尾數爲11001,那麼該值將由1(隱含)+ 1 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * 1/32 + 0 *(64 + 128 + ...)。所以確切的值不能被編碼,除非你可以將這些分數加起來,使其成爲確切的數字。這很少見。因此,幾乎總會有精確度損失。

+1

我可以建議指向經常提到的http://docs.sun.com/source/806-3568/ncg_goldberg.html嗎? (我自己沒有足夠的代表來做) – 2010-07-13 18:30:15

1

按照Dave的回答,你將會有一定程度的精確度損失。但是,如果您想要集中精力量化它並在超出特定數字時引發異常,則必須自行打開浮點數並解析出指數的尾數,然後進行一些分析以確定您是否「已超出你的容忍度。

但是,好消息是,它的通常是標準的IEEE浮點浮點數。 :-)