2012-06-12 197 views
-1

可能重複:
Floating point issue in C浮點不打印準確

#include<stdio.h> 
main() 
{ 
     int a,b; 
     float f; 
     scanf("%2d%3d%4f",&a,&b,&f); 
     printf("%d %d %f",a,b,f); 
} 

當我運行該程序和輸入2 4 56.8,它使輸出2 4 56.799999 ...但我期望2 4 56.8 ....爲什麼如此?

+1

不是'printf''「%f」'期望一個'double'? –

+1

我認爲它可以同時適用於浮動和雙重... –

+1

@FlorianSowade,是的,但浮動參數被提升爲雙倍的函數沒有原型和可變參數。 – AProgrammer

回答

6

這是正確的。浮點數是近似值。正如0.33333333近似於1/3,56.7999999近似爲56.8。 0.1沒有精確的浮點表示。

見一些已被寫入:

+0

謝謝wallyk先生...... –

+1

@SUMITGUPTA - 如果這能正確回答您的問題,請考慮標記爲'正確'。閱讀[如何](http://meta.stackexchange.com/a/5235/179533) – ArjunShankar

0

56.8是不是在你的C編譯器使用的浮點格式完全相同,表示的。 請參閱每位計算機科學家應瞭解的有關浮點運算的知識(1991)作者:David Goldberg。

0

它可能與浮點不準確有關。

0

由於浮點數域的連續空間被映射到離散級別,所有浮點數都不能存儲爲其精確值。例如,浮點數可以存儲在IEEE754單精度格式中。它將浮點數以三部分的形式存儲在32位內存中。假設[a, b]是兩個最接近的浮點數,可以完全用IEEE754格式表示,但我們將有無限數量的浮點數在ab之間,在這種情況下,這些數字將近似爲ab。這會導致您正在經歷的不精確。

該數字以標準化格式存儲,儘管某些非常小的數字可以非標準格式存儲。只要看看這些文件。

例如,在你的情況56.8 IEEE754單點精度表示將如下:

  • 符號:0(1個比特)
  • 偏置指數:10000100(8位)
  • 尾數:11000110011001100110011 (23位)

現在,如果這個數字轉換回十進制然後你

  • 標誌是0,即該值是正
  • 10000100 = 132偏置量127因此指數= 132 - 127 = 5
  • 尾數與隱藏比特1.11000110011001100110011
  • 調整小數點與指數後(移動5位右):111000。110011001100110011
    • 整數部分:111000 = 2^5 + 2^4 + 2^3 = 56
    • 的分數部分:0.110011001100110011 = 2^-1 + 2^-2 + 2^-5 + 2^-6 + 2^-9 + 2^-10 + 2^-13 + 2^-14 + 2^-17 + 2^-18 = 0.799999237

因此,當你檢索值從IEEE754單精度格式它變爲:56.799999237您已存儲的位置56.8

您可以在此處使用IEEE754表示形式:http://www.h-schmidt.net/FloatConverter/IEEE754.html