2011-04-28 48 views
2
#include <stdio.h> 
int main() 
{ 
    float a=1.0; 
    long i; 

    for(i=0; i<100; i++) 
    { 
     a = a - 0.01; 
    } 
    printf("%e\n",a); 
} 

結果是:6.59e-07爲什麼在下面的代碼中不是== 0?

+7

'6.59e-07'爲'0.000000659'。這非常接近'0'。足夠接近'浮動'精度。 – pmg 2011-04-28 09:39:14

+0

你問你爲什麼結果是近似爲零;或者你問你爲什麼看到以科學記數法顯示的結果? – razlebe 2011-04-28 09:46:21

+0

感謝你的時間......我的問題是爲什麼「a」以科學記數法顯示? – user1754940 2011-04-28 09:55:31

回答

11

這是一個二進制浮點數字,而不是一個小數一個 - 因此你需要期待舍入誤差。看到基本部本文中:

What Every Programmer Should Know About Floating-Point Arithmetic

例如,值0.01不具有二進制浮點型精確represenation。爲了得到一個「正確」的結果你的樣品中,你將不得不圓形或使用AA十進制浮點類型(見Wikipedia):

二進制定點類型是最常用的,因爲縮放操作可能是實現爲快速位移。二進制定點數可以精確地表示兩個分數冪,但是像二進制浮點數一樣,不能精確地表示十的分數冪。如果需要十的確切分數冪,則應使用十進制格式。例如,十進制(0.1)和百分之一(0.01)只能用二進制定點或二進制浮點表示近似表示,而它們可以精確地用十進制定點或十進制浮點表示表示。這些表示可以用許多方式進行編碼,包括BCD。

+0

另請注意,0.01不是2的冪,因此浮點數將嵌入在那裏,因此浮點數將包含垃圾,這會形成您看到的其餘錯誤。不確定,但0.125,8次可能會產生一個乾淨的循環? – 2011-04-28 15:23:25

3

這裏有兩個問題。如果您問,爲什麼我的printf語句將結果顯示爲6.59e-07而不是0.000000659,這是因爲您已將format specifier用於科學記數法:%e。你需要%f爲浮點數a

printf("%f\n",a); 

如果你問爲什麼結果不完全爲零,而不是0.000000659,答案是(正如其他人所指出的),就採用二進制數浮點運算需要期待四捨五入。

+0

感謝您的時間.....我的問題是關於結果不完全是零....感謝您的回答.. – user1754940 2011-04-28 10:00:22

+0

@ user692209在問題的意見,你說你的問題是關於科學符號,而不是價值。 :) – razlebe 2011-04-28 10:09:29

0

這是現場浮點數舍入錯誤。每次減去一個分數時,您都可以近似得到您通常從紙上的數字中得到的結果,因此最終結果非常接近零,但不一定精確爲零。

1

您必須指定%f來打印浮點數然後它將爲變量a打印0。

+0

經過測試。結果是0.000001 – 2011-04-28 09:44:10

+1

@Captain:%f將顯示精度爲6.這就是爲什麼你得到的結果爲0.000001。 – karthik 2011-04-28 09:46:12

+0

感謝您的時間給Captain和karthik – user1754940 2011-04-28 10:03:06

0

浮點數的精度不準確,這就是爲什麼你找到這個結果。

Cordially

相關問題