为什么C语言中的float精度问题总是让人抓狂,浮点数计算为何如此长尾?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2034个文字,预计阅读时间需要9分钟。
从问题引入+如果你之前接触过C语言,那么下面的这段代码你一定很熟悉:
从一个问题引入
如果你以前接触过C语言,那么对下面的这段代码一定很熟悉:
#include <stdio.h> int main(void) { float f_num1 = 21.75; float f_num2 = 13.45; printf("f_num1 = %f\n", f_num1); printf("f_num2 = %f\n", f_num2); printf("f_num1 + f_num2 = %f\n", f_num1 + f_num2); return 0; }
相信很多人不用运行,能够直接报出答案, f_num1 = 21.75 , f_num2 = 13.45 , f_num1 + f_num2 = 35.2 ,无论是从常识还是理论角度都不难理解。
下面我们运行一下程序,验证我们的猜测正不正确:
f_num1 = 21.750000
f_num2 = 13.450000
f_num1 + f_num2 = 35.200001
f_num1 和 f_num2 的结果和我们预想的一样,之所以后面多了四个0,是因为 %f 默认保留6位有效数字。但是 f_num1 + f_num2 的结果是什么鬼,这个 35.200001 是从哪里来的?
是不是一下子颠覆了我们的认知?
惊不惊喜,意不意外,刺不刺激?是不是发现自从学了C语言,连简单的算术都不会算了?
别急,还有更令你崩溃的。
本文共计2034个文字,预计阅读时间需要9分钟。
从问题引入+如果你之前接触过C语言,那么下面的这段代码你一定很熟悉:
从一个问题引入
如果你以前接触过C语言,那么对下面的这段代码一定很熟悉:
#include <stdio.h> int main(void) { float f_num1 = 21.75; float f_num2 = 13.45; printf("f_num1 = %f\n", f_num1); printf("f_num2 = %f\n", f_num2); printf("f_num1 + f_num2 = %f\n", f_num1 + f_num2); return 0; }
相信很多人不用运行,能够直接报出答案, f_num1 = 21.75 , f_num2 = 13.45 , f_num1 + f_num2 = 35.2 ,无论是从常识还是理论角度都不难理解。
下面我们运行一下程序,验证我们的猜测正不正确:
f_num1 = 21.750000
f_num2 = 13.450000
f_num1 + f_num2 = 35.200001
f_num1 和 f_num2 的结果和我们预想的一样,之所以后面多了四个0,是因为 %f 默认保留6位有效数字。但是 f_num1 + f_num2 的结果是什么鬼,这个 35.200001 是从哪里来的?
是不是一下子颠覆了我们的认知?
惊不惊喜,意不意外,刺不刺激?是不是发现自从学了C语言,连简单的算术都不会算了?
别急,还有更令你崩溃的。

