CSAPP:fsum(gcc)

    xiaoxiao2025-01-05  62

    交换律(浮点数)

    代码全览

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

    运行结果

    说明

    10的20次方比3.14大太多,计算机在进行浮点数运算时,先进行对阶,若阶码相差25位以上,就会自动忽略阶码的数。所以 -1e+20 + 3.14 = -1e+20 ,即3.14被计算机自动忽略了。 不满足结合律 1e+20 + -1e+20 +3.14 = 3.14 从左到右计算,即等于 0 + 3.14 = 3.14 1e+20 + 3.14 + -1e+20 = 0 从左到右计算,即等于1e+20 + -1e+20 = 0

    最新回复(0)