《C程序设计教程(第四版)——谭浩强》
例题2.7 检查浮点型数据的舍去误差
C语言知识:
浮点数在C语言用有两个类型,有float和double类型,其中double类型的数据精度更高
解题思路:
可以将一个double类型的数据和float类型的数据输入,观察他们的输出情况,从而判断他们的舍去误差
代码:
//《C程序设计教程(第四版)——谭浩强》
//例题2.7 检查浮点型数据的舍去误差//C语言知识:浮点数在C语言用有两个类型,有float和double类型,其中double类型的数据精度更高
//解题思路:可以将一个double类型的数据和float类型的数据输入,观察他们的输出情况,从而判断他们的舍去误差#include <stdio.h>
int main()
{float a;double b;printf("请输入一个浮点数a,用于判断float类型的误差:\n");scanf("%f",&a);printf("请输入一个浮点数b,用于判断double类型的误差:\n");scanf("%lf",&b);//读取 double 类型的输入(注意 %lf)printf("float类型的数据a的输出结果为:\n%f\n",a);printf("double类型的数据b的输出结果为:\n%lf\n",b);return 0;
}
运行过程:
代码运行过程中遇到的问题:
1.scanf格式化符号:在读取double类型的变量时,您使用了%f ,这是不正确的,应该使用 %lf。
2.输出格式:虽然%f在 printf 中是正确的,但通常打印 double 类型的变量时应该使用%lf来强调其类型。
3.浮点数精度:您可能想要展示浮点数的精度误差,而仅仅打印这些数字可能不足以体现。
// 额外:演示浮点数的误差
printf("\n浮点数在计算机内部的存储及其误差示例:\n");
printf("a + 1.0f = %f\n", a + 1.0f);
printf("b + 1.0 = %lf\n", b + 1.0);
4.单精度浮点数变量,只能提供6~7位有效数字,第7位之后的数字不起作用,后面的几位被忽略了。
5.C编译系统把所有浮点数常量都按照双精度处理,分配8字节,这是为了在运算时保持较高的精度。如果不想把浮点型常量按照双精度处理,可以在数值后面加字母f或者F,这样编译系统就会把他们当成单精度浮点数处理,分配4字节。这样,数值范围和有效位数都减小了。