使用C語言浮點數的精度極限比較精確的求近似值

2021-08-29 16:56:18 字數 2095 閱讀 1619

今天繼續學習《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...