关于C语言,高手指教

来源:百度知道 编辑:UC知道 时间:2024/05/11 03:09:07
#include<stdio.h>
#include<stdlib.h>
int main()
{
float f1=314.159;
printf("%f\n",f1);
system("pause");
return 0;
}
以上程序输出结果为什么是314.158997?百思不得其解

实数值不能精确测试,比如在计算机内部0.078实际表示为0.077999,所以如果定义
float a=0.078 那么
if( a == 0.078 )
这一句在计算机中永远不可能成立。这是机器,都有保存精度,不是人脑靠判断。实数比较只能测试一个可接受的数值范围,所以要正确判断可以这样。
if( fabs(a-0.078) <= 0.00001 )
printf("a is equal 0.078");

Brian W. Kernighan and Dennis M. Ritchie(Ritchie是c语言之父)所写的<<The c programming language>>确立了著名的k&r标准,Dennis M. Ritchie还实现了第一个c语言的编译器,该编译器会把float自动转换成double型进行计算,最后输出又转换成float型,这样会失去一些精度。以后开发的c编译器都采用了这种方法,所以说一般不用float型。
float型数值精度是小数点以后6位左右,double型是小数点以后15位左后。
清楚了这个道理问题就简单了,编译器先把314.159转换成double型存放,再输出时用转换成float输出,根据上面说明,表示方法和转换时精度都有损失,结果只能精确到小数点以后第五位,第六位是近似值。这就是原因。

当然了现在的c++编译器是否还是采用了k&r标准,不得而知。各个编译器实现可能不同。

因为 我不明白

因为浮点型默认小数点后边有6位小数,所以如果尾数不够会自动随机产生补上。