float x = 384.951257;
std::cout << std::fixed << std::setprecision(6) << x << std::endl;
輸出是384.951263。爲什麼?我正在使用gcc。C++浮點控制檯輸出問題
float x = 384.951257;
std::cout << std::fixed << std::setprecision(6) << x << std::endl;
輸出是384.951263。爲什麼?我正在使用gcc。C++浮點控制檯輸出問題
float
通常只有32位。每個十進制數約3位(2 大致等於10 ),這意味着它不能可能代表小於約11個十進制數字更多,佔它也需要表示其他信息,諸如大小,讓我們說6-7個十進制數字。嘿,那就是你得到的!
檢查例如維基百科的細節。
使用double
或long double
更好的精度。 double
是C++中的默認值。例如,文字3.14
的類型是double
。
優秀的解釋!我只有一個問題,用'符號'或''來表示多少位小數。 (我想了解什麼是11 - 7或8) –
@Digital_Reality:例如http://en.wikipedia.org/wiki/IEEE_floating_point#Basic_formats –
@ Cheersandhth.-Alf:這裏的問題不是精確的,但並不是所有的小數都可以在二進制數系統中完全表示(請參閱我的答案)。使用'double'和'long double'也無濟於事。 [見這裏](http://ideone.com/8JzUpz)。 – legends2k
花車的分辨率有限。因此,當您將值分配到x
時,它會變圓。
所有的答案在這裏說,好像這個問題是由於浮點數和他們的能力,但這些都只是實現細節;這個問題比這個更深。使用二進制數字系統表示十進制數時會發生此問題。甚至像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。
正如我所看到的'setprecision'不是std命名空間的成員。所以它不應該先跑。它如何爲你提供產出? 是的,它是給出這個輸出,因爲編譯器可能會捨去float值。 –
@RavindraGupta'#包括'它就在那裏。 –
molbdnilo