学习日志之fsum.c的运行及解释
程序员文章站
2022-06-29 22:49:18
...
1.fsum.c的代码展示
2.在Linux操作系统下的举例
3.代码运行的详细解释及涉及的知识内容
1.fsum.c代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 256
int main(int argc, char *argv[]) {
char prefix[BUFSIZE];
char next[BUFSIZE];
int i;
float sum = 0.0;
for (i = 1; i < argc; i++) {
float x = atof(argv[i]);
sum += x;
if (i == 1) {
sprintf(prefix, "%.4g", x);
} else {
sprintf(next, " + %.4g", x);//将x写入next
strcat(prefix, next);//将next追加到prefix末尾
printf("%s = %.4g\n", prefix, sum);
}
}
return 0;
}
2.操作举例
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 1e20 -1e20 3.14
1e+20 + -1e+20 = 0
1e+20 + -1e+20 + 3.14 = 3.14
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out -1e20 3.14
-1e+20 + 3.14 = -1e+20
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out -1e20 3.14 1e20
-1e+20 + 3.14 = -1e+20
-1e+20 + 3.14 + 1e+20 = 0
3.详细解释及知识内容
我们可能会有疑问为什么数学上的运算在这里可能不成立?这是因为浮点数表示的精度有限,导致了浮点运算是不可结合的。整数的表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的,而浮点数虽然可以编码一个较大的数值范围,但这种表示是近似的。
举例中1e+20和-1e+20绝对值远远大于3.14,很大的数加上3.14将无法看到效果。浮点数的加法首先要对阶,当1e+20或-1e+20加上3.14时,加上3.14不能让1e+20最低位进位,所以结果还是绝对值非常大的那个数。
知识点
重点在于弄清浮点数的表示及加法运算舍入等问题。
argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数。
* argv: 字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数。 argv[0] 指向程序运行的全路径名 ,argv[1] 指向在DOS命令行中执行程序名后的第一个字符串, argv[2] 指向执行程序名后的第二个字符串,以此类推。
atof(),是C 语言标准库中的一个字符串处理函数,功能是把字符串转换成浮点数,所使用的头文件为<stdlib.h>。
下一篇: 深度学习工具1.3 Python安装