[問題] double 值比較大小

看板C_and_CPP (C/C++)作者 (MAI舞)時間16年前 (2010/01/29 03:10), 編輯推噓1(107)
留言8則, 3人參與, 最新討論串1/1
以下是小弟寫的一個開根號程式 //程式碼: #include<stdio.h> #include <stdlib.h> int main(void) { double i,j,k; printf("請輸入一個您想要開根號的值:"); scanf("%lf",&i); printf("orign : %lf \n",i); for(j=0;;j=j+0.1) { if( (j*j) >i) { printf("j: %lf , i: %lf \n",j*j,i); //印出來是 j: 16.00000 i: 16.00000 break; } } k=j-0.1; printf("您輸入的值經過開根號為:+%-lf\n",k); // system("pause"); return 0; } 問題: 不知為什麼 輸入 16 的情況下,它的結果不會是 4? 為什麼上面會在 j*j 和 i值一樣時,進入if裡呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.2.142

01/29 05:09, , 1F
浮點數不精確 運算會有誤差
01/29 05:09, 1F

01/29 05:10, , 2F
在做浮點數的 比較運算 時, 都要加上一個誤差值
01/29 05:10, 2F

01/29 05:11, , 3F
一般誤差值可以設定為 10^-5 或是 10^-7
01/29 05:11, 3F

01/29 05:12, , 4F
你把 %lf 全部改為 %.16lf 你就知道原因了
01/29 05:12, 4F

01/29 05:16, , 5F
把 if((j*j)>i) 改為 if((j*j)>i+1e-5) 就對了
01/29 05:16, 5F

01/29 05:17, , 6F
為什麼誤差是加在 > 後面,你仔細想想原因
01/29 05:17, 6F

01/29 05:41, , 7F
謝謝這位熱心的朋友, 我懂了
01/29 05:41, 7F

01/29 11:58, , 8F
學到了一課
01/29 11:58, 8F
文章代碼(AID): #1BOU4CFc (C_and_CPP)
文章代碼(AID): #1BOU4CFc (C_and_CPP)