学习日志之fsum.c的运行及解释

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值