CSAPP学习日志3:fsum
程序员文章站
2022-06-29 18:58:28
...
代码全览
#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);
strcat(prefix, next);
printf("%s = %.4g\n", prefix, sum);
}
}
return 0;
}
运行结果如下:
对比运行结果1和运行结果3,发现参与运算的数是一样的,运算顺序不同,运算的结果也不一样。在我们的认知中,加法是有结合律的,而在机器的浮点数运算中,结合律并不适用,原因是:浮点数进行运算时,首先需要对阶,小阶向大阶看齐,若阶码大的数的阶码比阶码小的数的阶码大25及以上,则会发生阶码大的数吃掉阶码小的数的情况,-1e20+3.14=-1e20就是这种情况。
上一篇: UDP套接字编程基础
下一篇: NodeJs安装笔记--windows