为什么C语言中的float精度问题总是让人抓狂,浮点数计算为何如此长尾?

2026-04-19 04:361阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2034个文字,预计阅读时间需要9分钟。

为什么C语言中的float精度问题总是让人抓狂,浮点数计算为何如此长尾?

从问题引入+如果你之前接触过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语言中的float精度问题总是让人抓狂,浮点数计算为何如此长尾?

从问题引入+如果你之前接触过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语言,连简单的算术都不会算了?

别急,还有更令你崩溃的。

阅读全文