今天繼續學習《c語言的科學和藝術》一書,今晚終於結束了第六章演算法部分的課後習題,同時我也非常高興自己已經完成了本書第一部分的學習,很有一種收穫的感覺。
今天做的題中有乙個知識點,是關於浮點數精度問題的。要知道,在c語言中浮點數型別如同float,double等都是不精確的,萬萬不可以使用他們做科學計算,否則結果很可能與答案有很大的偏差。演算法這一章中介紹了乙個浮點數不精確的例子就是如果for迴圈中的變數是double型別的,如for(double i = 1.0; i <= 2.0; i += 0.1 )。看上去i的值會從1.0,1.1,1.2...一直取到2.0,但是在大多數電腦上是無法取值到2.0的。因為計算機中i最終的值很有可能是1.9999999...我在自己的虛擬機器上驗證了一下作者所舉的例子,證明其正確。
今天我想說的很我第二段中所講的有些聯絡,是利用浮點數的精度限制做計算(當然不可能是精確的計算了)。我舉個例子吧,比如使用計算機模擬圓周率pi的計算,我們通過乙個公式計算,一直計算下去,直到計算機的浮點精度達到極限。這樣計算雖然不能夠精確的計算出我們想要的答案,但是這個值是計算機所能計算的最近似這個精確值的值。下面我就通過一道練習題說明,這是《c語言的科學和藝術》第六章中最後一道習題。
其實這道題演算法非常容易想出,因為規律非常明顯。第一項為1,後面的項中分子為1分母為第n-1項的階乘。
於是,小使了一下逐步求精的設計原則,在主函式中編寫了for迴圈來進行項的相加,並且在其中呼叫factorial函式(自定義的求階乘函式)。請先不要看** 。
for迴圈裡面不就是乙個sum += 1 / factorial(n)麼?結束了main函式的編寫後,開始宣告、定義求階乘的函式factorial。開始的時候,我將factorial定義為long型別,引數也定義為long型別,但是最後程式居然報錯說浮點數被0所除。我很是不解,最後我將程式改動,將原來的long型別全部修改為double型。現在想想當時的問題,難道是long轉換為double型的時候會損失精度?(我曾經測試1.0/factorial(2),結果居然為0)(floating point error: divided by 0)精度的問題很是令人煩惱。今天的重點不在這個,雖然你可能覺得我連這個都沒有搞清楚而不應該往下講下去,但是下面的內容我是清楚的。我所講的就是關於如何將計算結果達到浮點數的精度限制的問題,請看**18行,for迴圈的迴圈條件為sum != sum + term。這兩個變數都是double性浮點變數,其中term的值是乙個越來越小的變數(term永遠大於0,因為term = 1 / f, f又大於0 )因此,必然會有乙個時刻term將等於0,那是sum = sum + term,迴圈停止。
收穫:學會使用浮點數的精度限制來「比較精確」的計算近似值,使用這一方法在許多計算中非常重要。
**如下: 1
/*2the art and sience of c.
3issue 6, project 10.
4title: e5*/
67#include
<
stdio.h
>
8#include
<
math.h
>
9#include
"simpio.h"10
double
factorial(
double
n );
1112
void
main()
1324
25printf(
"%.10lf\n
",e);
2627
getch();
28printf("\n
");29}
3031
double
factorial(
double
n )32
38if
( n
==1.0
)
return( 1
);39
if( n
>
1.0)
return
( n
*factorial( n -1
) );40}
C 的浮點數比較
今天寫a1,比較飛彈是否到目標 y軸相等即可 到目標就畫個圈圈,也就是炸彈,結果怎麼都炸不出 搞了半天,想想事情沒那麼簡單 然後就大致比較了一下,這個世界座標軸和滑鼠座標軸位置還沒搞清楚,不過終於可以炸了 bool hasreacheddestination if pos0.y 0.5 return...
C語言中的浮點數比較
浮點數分為單精度和雙精度兩種。在記憶體中的儲存方式按照ieee754標準。通常情況下,單精度佔4個位元組,雙精度佔8個位元組。可以使用sizeof驗證一下。include int main 輸出結果為4 8 x和y變數在十進位制數值上是相等的都是0.1。但是0.1用二進位制表示的時候就會丟失精度,只...
C語言中浮點數的精度問題
1.浮點數出現精度問題的原因 浮點 位元組數有效數字位 float46 double815 實際上一般選用double型別,double有15位有效數字若輸入的數字為16位則會有誤差。int main 2.怎樣才能減少誤差帶來的影響 使用巨集定義乙個eps來判斷誤差 define eps 0.000...