2009-10-05 75 views
3

雖然內部表示有17個ditigs,但IEE754(64位)浮點應該正確表示15位有效數字。有沒有辦法強制第16位和第17位數字爲零?C++中的double類型數字

參考文獻: http://msdn.microsoft.com/en-us/library/system.double(VS.80).aspx: 。 。

請記住,浮點數只能接近十進制數,並且浮點數的精度決定了該數的精確度接近十進制數。默認情況下,Double值包含15位精度的十進制數字,但內部最多保留17位數字。浮點數的精度有幾個後果: 。 。

實例號: D1 = 97842111437.390091
D2 = 97842111437.390076
D1和D2在那些不應該是顯著16和17位小數不同。尋找方法迫使他們歸零。即 D1 = 97842111437.390000 D2 = 97842111437.390000

+2

你說的是64位浮點數嗎?在15個重要的小數位? – John 2009-10-05 16:58:44

+0

我不得不同意約翰W.這個問題有點含糊。內部表示不是十進制的。 – 2009-10-05 18:00:01

+0

IEEE754雙打有52位尾數:http://en.wikipedia.org/wiki/Double_precision_floating-point_format 除了英特爾使用具有64位尾數(大約19位數的分辨率)的80位浮點寄存器外,我從來沒有聽說過任何不同的「內部表現」。你能提供一個你指的是什麼的參考嗎? – KeyserSoze 2009-10-05 18:02:30

回答

0

您應該能夠通過與浮點數和整型大小相同的領域創造了工會直接修改您的比特數。然後你可以訪問你想要的位並設置它們。這裏是我在敲打符號位的例子;當然,你可以選擇任何你想要的領域。

#include <stdio.h> 

union double_int { 
    double    fp; 
    unsigned long long integer; 
}; 

int main(int argc, const char *argv[]) 
{ 
    double   my_double = 1325.34634; 
    union double_int *my_union = (union double_int *)&my_double; 

    /* print original numbers */ 
    printf("Float %f\n", my_double); 
    printf("Integer %llx\n", my_union->integer); 

    /* whack the sign bit to 1 */ 
    my_union->integer |= 1ULL << 63; 

    /* print modified numbers */ 
    printf("Negative float %f\n", my_double); 
    printf("Negative integer %llx\n", my_union->integer); 

    return 0; 
} 
+0

我想我誤解了這個問題....好吧,我會等待澄清,然後在必要時刪除這個問題。 – 2009-10-05 17:56:23

11

號反例如:兩個最接近浮點數理性

1.11111111111118 

(其具有15個十進制數字)是

1.1111111111111799942818834097124636173248291015625 
1.1111111111111802163264883347437717020511627197265625 

換句話說,有不是以1.1111111111111800開頭的浮點數。

3

此問題有點畸形。硬件以二進制形式存儲數字 ,而不是十進制。因此,在一般情況下,您不能在基數10中進行精確的 數學運算。一些十進制數(0.1是其中之一!)不要 甚至在二進制中有非重複表示。如果您有這樣的精度要求 ,那麼您關心的數字 的精度已知精確到15位十進制數字,您將需要 爲您的數字選擇另一種表示形式。

3

沒有,但我不知道這是有關你的任何問題(GCC專用):

GCC Documentation

-ffloat店不要存放浮點變量在寄存器中, 抑制 可能會改變浮點值 是從寄存器還是從存儲器中取得的其他選項。

此選項防止在諸如 68000其中浮點寄存器(的68881) 保持更高的精度比 雙應該具有不希望的機器過量 精度。 類似的x86架構。對於大多數程序來說,多餘的 精度確實不錯,但是一些 程序依賴於IEEE浮點的精確 定義。在修改這些程序以將所有相關的 中間計算存儲爲 變量後,使用 -ffloat-store作爲此類程序。

+1

雖然命令行選項是GCC特有的,但問題不在於此。我在68030和68040 Mac上使用了一個C編譯器,該編譯器具有「擴展」浮點數,這只是68881實現中的80位表示。 – 2009-10-05 20:09:05

0

一般來說,人們只關心像這樣顯示的號碼時(「我只希望在第一X數字」)。這對stringstream s或sprintf來說相對容易。

如果您關心的是將數字與==進行比較;你真的不能用浮點數來做到這一點。相反,你想看看這些數字是否足夠接近(例如,在對方的epsilon()之內)。

直接播放數字的位並不是一個好主意。

相關問題