#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?
#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?
這是一個二進制浮點數字,而不是一個小數一個 - 因此你需要期待舍入誤差。看到基本部本文中:
What Every Programmer Should Know About Floating-Point Arithmetic
例如,值0.01不具有二進制浮點型精確represenation。爲了得到一個「正確」的結果你的樣品中,你將不得不圓形或使用AA十進制浮點類型(見Wikipedia):
二進制定點類型是最常用的,因爲縮放操作可能是實現爲快速位移。二進制定點數可以精確地表示兩個分數冪,但是像二進制浮點數一樣,不能精確地表示十的分數冪。如果需要十的確切分數冪,則應使用十進制格式。例如,十進制(0.1)和百分之一(0.01)只能用二進制定點或二進制浮點表示近似表示,而它們可以精確地用十進制定點或十進制浮點表示表示。這些表示可以用許多方式進行編碼,包括BCD。
另請注意,0.01不是2的冪,因此浮點數將嵌入在那裏,因此浮點數將包含垃圾,這會形成您看到的其餘錯誤。不確定,但0.125,8次可能會產生一個乾淨的循環? – 2011-04-28 15:23:25
這裏有兩個問題。如果您問,爲什麼我的printf語句將結果顯示爲6.59e-07
而不是0.000000659
,這是因爲您已將format specifier用於科學記數法:%e
。你需要%f
爲浮點數a
。
printf("%f\n",a);
如果你問爲什麼結果不完全爲零,而不是0.000000659
,答案是(正如其他人所指出的),就採用二進制數浮點運算需要期待四捨五入。
感謝您的時間.....我的問題是關於結果不完全是零....感謝您的回答.. – user1754940 2011-04-28 10:00:22
@ user692209在問題的意見,你說你的問題是關於科學符號,而不是價值。 :) – razlebe 2011-04-28 10:09:29
這是現場浮點數舍入錯誤。每次減去一個分數時,您都可以近似得到您通常從紙上的數字中得到的結果,因此最終結果非常接近零,但不一定精確爲零。
您必須指定%f來打印浮點數然後它將爲變量a打印0。
經過測試。結果是0.000001 – 2011-04-28 09:44:10
@Captain:%f將顯示精度爲6.這就是爲什麼你得到的結果爲0.000001。 – karthik 2011-04-28 09:46:12
感謝您的時間給Captain和karthik – user1754940 2011-04-28 10:03:06
浮點數的精度不準確,這就是爲什麼你找到這個結果。
Cordially
'6.59e-07'爲'0.000000659'。這非常接近'0'。足夠接近'浮動'精度。 – pmg 2011-04-28 09:39:14
你問你爲什麼結果是近似爲零;或者你問你爲什麼看到以科學記數法顯示的結果? – razlebe 2011-04-28 09:46:21
感謝你的時間......我的問題是爲什麼「a」以科學記數法顯示? – user1754940 2011-04-28 09:55:31