看板 C_and_CPP 關於我們 聯絡資訊
以下是小弟寫的一個開根號程式 //程式碼: #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
walker2009:浮點數不精確 運算會有誤差 01/29 05:09
walker2009:在做浮點數的 比較運算 時, 都要加上一個誤差值 01/29 05:10
walker2009:一般誤差值可以設定為 10^-5 或是 10^-7 01/29 05:11
walker2009:你把 %lf 全部改為 %.16lf 你就知道原因了 01/29 05:12
walker2009:把 if((j*j)>i) 改為 if((j*j)>i+1e-5) 就對了 01/29 05:16
walker2009:為什麼誤差是加在 > 後面,你仔細想想原因 01/29 05:17
kevintwo:謝謝這位熱心的朋友, 我懂了 01/29 05:41
cjoe:學到了一課 01/29 11:58