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

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;
}

运行结果如下:
CSAPP学习日志3:fsum
对比运行结果1和运行结果3,发现参与运算的数是一样的,运算顺序不同,运算的结果也不一样。在我们的认知中,加法是有结合律的,而在机器的浮点数运算中,结合律并不适用,原因是:浮点数进行运算时,首先需要对阶,小阶向大阶看齐,若阶码大的数的阶码比阶码小的数的阶码大25及以上,则会发生阶码大的数吃掉阶码小的数的情况,-1e20+3.14=-1e20就是这种情况。