欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习日志之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>。