C/CPP 中关于浮点数计算精度问题及解决办法

您所在的位置:网站首页 d25t精度 C/CPP 中关于浮点数计算精度问题及解决办法

C/CPP 中关于浮点数计算精度问题及解决办法

2024-06-30 00:46| 来源: 网络整理| 查看: 265

在 C/C++ 中,浮点数运算并不像整型那样容易,他往往伴随着一系列的精度问题。而正是这些精度问题,往往会导致程序中一些不可预知错误,而这正是令我们头疼的问题。

一、为什么会精度丢失?

这个问题产生的原因从原理上解释起来并不难。

首先,我们以十进制数 0.9 为例。

然后,我们将十进制数 0.9 转为二进制数(可以用乘二顺取法[1]手算),于是你会得到 0.1110011001100110011... 一个无限循环的二进制小数序列。

然而在计算机中,我们并没有无限的内存供你存放这个无限循环序列,这一点是显而易见的(通常变量允许保存的部分更是少得可怜)。于是,我们就需要对这个序列进行截断。

为了讲解方便,我们就以 12 位来存储这的二进制小数序列。

于是,你会得到一个被存储在计算机中的二进制小数:0.11100110011(当然实际存储往往要长一些,在 64 位机中的 double (64bit) 类型变量对小数部分可以存储 52 位[2])。

当你需要再次显示这个数时,你的计算机就需要将这个二进制小数转换回十进制数。

于是,你会得到 0.89990234375 这个数。

看吧,这就是精度丢失!

这一过程你可以用这个网站切身感受:RapidTables(进制转换器)

二、在 C++ 中的浮点数精度问题

首先,让我们从一段程序开始这个问题。

例 2.1#include int main() { float a = 10.0; float b = 0.1; float c = a - b; std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3