先看一段代码:
#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