2014-01-22 184 views
3
float x = 384.951257; 
std::cout << std::fixed << std::setprecision(6) << x << std::endl; 

輸出是384.951263。爲什麼?我正在使用gcc。C++浮點控制檯輸出問題

+0

正如我所看到的'setprecision'不是std命名空間的成員。所以它不應該先跑。它如何爲你提供產出? 是的,它是給出這個輸出,因爲編譯器可能會捨去float值。 –

+3

@RavindraGupta'#包括'它就在那裏。 – molbdnilo

回答

8

float通常只有32位。每個十進制數約3位(2 大致等於10 ),這意味着它不能可能代表小於約11個十進制數字更多,佔它也需要表示其他信息,諸如大小,讓我們說6-7個十進制數字。嘿,那就是你得到的!

檢查例如維基百科的細節。

使用doublelong double更好的精度。 double是C++中的默認值。例如,文字3.14的類型是double

+0

優秀的解釋!我只有一個問題,用'符號'或''來表示多少位小數。 (我想了解什麼是11 - 7或8) –

+0

@Digital_Reality:例如http://en.wikipedia.org/wiki/IEEE_floating_point#Basic_formats –

+0

@ Cheersandhth.-Alf:這裏的問題不是精確的,但並不是所有的小數都可以在二進制數系統中完全表示(請參閱我的答案)。使用'double'和'long double'也無濟於事。 [見這裏](http://ideone.com/8JzUpz)。 – legends2k

2

花車的分辨率有限。因此,當您將值分配到x時,它會變圓。

2

所有的答案在這裏說,好像這個問題是由於浮點數和他們的能力,但這些都只是實現細節;這個問題比這個更深。使用二進制數字系統表示十進制數時會發生此問題。甚至像0.1)10 is not precisely representable in binary那樣簡單,因爲it can only represent those numbers as a finite fraction where the denominator is a power of 2。不幸的是,這並不包括大部分可以表示爲10的有限分數的數字,如0.1。

的單精度float數據類型通常被映射到binary32作爲所謂由IEEE 754標準,具有32位,被分割爲1個符號位,8指數位和23個有效數位(不包括隱藏/隱式位) 。因此,當轉換爲binary32時,我們必須計算高達24位。

其他的答案在這裏躲避涉及的實際計算時,我會盡力去做。該方法解釋爲in greater detail here。因此,讓轉換實數成二進制數:

整數部分384) = 1.1億)(使用連續分割的通常的方法由2)

小數部分0.951257)可以通過連續乘以2被轉換並取整數部分

0.951257 * 2 = 1.902514

0.9 02514 * 2 = 1.805028

0.805028 * 2 = 1.610056

0.610056 * 2 = 1.220112

0.220112 * 2 = 0.440224

0.440224 * 2 = 0.880448

0.880448 * 2 = 1.760896

0.760896 * 2 = 1.521792

0.521792 * 2 = 1。043584

0.043584 * 2 = 0.087168

0.087168 * 2 = 0.174336

0.174336 * 2 = 0.348672

0.348672 * 2 = 0.697344

0.697344 * 2 = 1.394688

0.394688 * 2 = 0.789376

收集二進制中的殘餘小數部分,我們有0.111100111000010)。二進制的總數將是110000000.111100111000010);這需要24位。

將此轉換回十進制會給你384 +(15585/16384)= 384.951232)。隨着舍入模式(圓到最近)啓用這個來,你看到,384.951263)。

這可以是verified here