歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言陷阱:浮點運算

C語言陷阱:浮點運算

日期:2017/3/1 9:57:45   编辑:Linux編程

在Stack overflow上看到這樣一個問題。

計算如下表達式的值:

P=(1/2-3/4)*(5/6-7/8)*...*[n/(n-1) - (n+2)/(n+3)]。

程序如下:

#include<stdio.h>int main (){float s, p = 1.0;int i, n;
printf("Put a number:");
scanf("%d", &n);for(i = 1; i <= n; ++i){ 
p *= ((i)/(i+1)-(i+2)/(i+3));}
printf("\n p=%f", p);}


運行之後不管n為何值,p的值都輸出為0,為什麼?

初看好像程序沒什麼問題,但仔細想一下發現計算p的表達式p *= ((i)/(i+1)-(i+2)/(i+3))中的i是int型變量,對於i>=1,(i)/(i+1)永遠都為0。

所以表達式應該修改為:p *= ((float)(i)/(i+1)-(float)(i+2)/(i+3));

或者 p *= ((i)/(i+1.0)-(i+2.0)/(i+3.0).

Copyright © Linux教程網 All Rights Reserved