C語言 int,float,double整型和浮點型資料在相互運算時bug原因

Yixin_Hu發表於2019-05-26

先看一段程式碼:

#include <stdio.h>
int main ()
{
	double a;
	int b,c;
	b = 5,c=6;
	a = b/c;
	printf("%f\n",a);
	return 0;
}
>>>
0.000000
Press any key to continue

按理來說,a應該等於0.833333。但是結果a等於零。
這是因為,程式先整數計算b/c,此時的輸出實際上是被截去了小數部分,再轉化為float的數。故應該把bc定義為浮點型別。

再看一個例子:

#include <stdio.h>
#include <math.h>
int main()
{
	int i=1,d=1,t;
	double pi=0.0;
	for (;;d++,i+=2)
	{
		if (d % 2 == 0)  t = -i;
		//第偶數個式子是負數
		else (t = i);
		if (fabs(1/t) < (1e-6)) break;
		//fabs(x),對雙精度x求絕對值,得到結果是雙精度型
		pi = pi + (1/ t);
	}
	pi = pi*4;
	printf("pi = %f\n",pi);
	return 0;
}
>>>
pi=4.00000
Press any key to continue

這是一個求π的小程式。其演算法是:
在這裡插入圖片描述
為什麼得到的結果是pi = 4.00000呢?
原因和第一個例子一樣,由於我們定義t為整型,而fabs和pi都是雙精度型,故在計算 1 / t 時,程式先整數計算1 / t ,取整數部分,再對其轉換為雙精度型。因此,迴圈體只執行一次,在 t = -3 時,fabs() = 0,執行break,退出迴圈。

為使得程式正常執行,我們應該把t定義為雙精度型。

#include <stdio.h>
#include <math.h>
int main()
{
	int i=1,d=1;
	double pi=0.0,t;
	for (;;d++,i+=2)
	{
		if (d % 2 == 0)  t = -i;
		else (t = i);
		if (fabs(1/t) < (1e-6)) break;
		pi = pi + (1/ t);
	}
	pi = pi*4;
	printf("pi = %f\n",pi);
	return 0;
}
>>>
pi = 3.141591
Press any key to continue

相關文章