当前位置: 首页 > 知识库问答 >
问题:

关于python的舍入误差和浮点数

辛渝
2023-03-14
>>> 1/3
0.3333333333333333

>>> 1/3+1/3+1/3
1.0 

我不明白为什么这是1.0。它不应该是0.999999999999吗?因此,我提出了一种解决方案,python对其答案进行了自动舍入,但如果大于,则无法解释以下结果。。。

>>> 1/3+1/3+1/3+1/3+1/3+1/3
1.9999999999999998

>>> (1/3+1/3+1/3)+(1/3+1/3+1/3)
2.0

我以为四舍五入错误是因为尾数中使用的位数有限,指数(浮点数),但0.9999~~9也没有超出位数的限制...有人能解释一下为什么这些结果会这样吗?

共有3个答案

施喜
2023-03-14

这个问题可能会为浮点错误提供一些答案浮点数学坏了吗?

有了括号,编译器将加法分解为更小的部分,减少了浮点的可能性,浮点不应该存在并继续“累积”浮点错误。最有可能的是,当分成3组时,编译器知道总和将是1并将1 1加在一起

扈翰
2023-03-14

这是IEEE-754算法的一个细微之处。写作时:

>>> 1/3
0.3333333333333333

您看到的打印的数字是内部存储的数字的“四舍五入”版本,该数字是根据1/3进行存储的结果。这就是双倍-

现在你可以问,有没有办法找出两者的区别?是,使用分数模块:

>>> from fractions import Fraction
>>> Fraction(1, 3) - Fraction(1/3)
Fraction(1, 54043195528445952)

啊,那很有趣。所以它比实际值略小,区别是1 / 54043195528445952。这当然是意料之中的。

那么,当你把这两个加在一起时会发生什么呢。让我们看看:

>>> Fraction(2,3) - Fraction(1/3+1/3)
Fraction(1, 27021597764222976)

同样,您接近rds的2/3,但仍然不太接近。让我们再做一次加法:

>>> Fraction(1,1) - Fraction(1/3+1/3+1/3)
Fraction(0, 1)

答对 了对于其中的3个,表示形式正好是1。

为什么会这样?好的,在每次加法中,你都会得到一个接近你认为答案应该是什么的数字,但是内部舍入会导致结果变成一个接近的数字,这不是你想要的。再加上三个选项,你的直觉告诉你什么,以及内部舍入是否匹配。

必须强调的是,加法不会产生1/3 1/3 1/3;它只生成一个内部值,其最接近的IEEE-754双精度浮点值表示形式是1。这是一个微妙但重要的区别。希望有帮助!

熊俊人
2023-03-14

大多数Python实现使用二进制浮点格式,最常见的是IEEE-754 binary64格式。此格式没有十进制数字。它有53个二进制数字。

当此格式与舍入到最近的偶数关系一起使用时,计算1/3得到0.3333333333333333148296162562473909929472198486328125。默认情况下,Python实现无法显示全部值;它显示“0.3333333333333333333”,这会误导您。

将此数字添加到自身后,结果为0.6666666666662965923251249478198587894439697265625。这个结果是准确的;它没有舍入误差。(也就是说,它没有新的舍入误差;它本身就是0.3333333333333148296162562473909939472198486328125的和。)

再次添加0.333333333333333314829616256247390992939472198486328125时,实数结果不适合53位。所以结果必须四舍五入。这个舍入恰好向上舍入,正好产生1。

再次添加0.333333333333333314829616256247390992939472198486328125时,结果再次不匹配,并四舍五入。这一次,舍入正好向下,生成1.333333333333259318465024985639717578887939453125。

后续添加产生1.666666666666666518636930049979127943515777587890625,然后1.9999999999999997779553950749686919152736663818359375,Python实现显示为“1.9999999999999998”。

当您将算术分组为(1/3 1/3 1/3) (1/3 1/3 1/3)时,则每个括号项目都获得1,如上所述,1 1当然是2。

 类似资料:
  • 问题内容: 我不知道这是否是一个明显的错误,但是在运行Python脚本以更改模拟参数时,我意识到缺少和的结果。在调查中,我注意到以下Python代码: 生成的相同文件的增量= 0.28和0.29,与.57和.58相同,原因是python返回float(29)/ 100为。但这不是系统错误,从某种意义上说,它并不是每个整数都发生的。因此,我创建了以下Python脚本: 而且我看不到发生这种舍入错误的

  • 我已经读到,由于尾数中的位数有限,浮点可能会遇到舍入。另外,我读到机器ε表示一个浮点,使得1ε等于下一个最小可表示数。 a) 然而,我无法连接ε和舍入误差之间的关系。有人能用外行的语言解释一下它们之间的关系吗? b)ε是否只依赖于用于尾数的位,甚至用于指数的位也在确定ε中起作用? c) 1/3是如何用浮点表示的?我知道它是0.3(重复出现),但接下来呢?从这里开始,它将如何以二进制形式表示?

  • 我有一个关于PostgreSQL 9.2中浮点数的新手问题。 有没有直接舍入浮点数的函数,即不需要先将数字转换为数字类型? 另外,我想知道是否有一个函数可以用任意的度量单位进行取整,例如精确到0.05? 首先将数字转换为十进制形式时,以下查询工作正常: 然而,我真正想要实现的是以下几点: 这当前给了我以下错误: 谢啦

  • 问题内容: 我期望的是0.313而不是0.312,为什么会这样呢?还有其他方法可以用来获得0.313吗? 谢谢 问题答案: Python 3使用舍入到偶数方法根据IEEE 754标准进行舍入。 如果您想采用另一种方式取整,则只需手动实施即可: 用法示例: 注意: 在python2中,舍入总是远离零,而在python3中,它舍入为偶数。(例如,请参见功能文档中的2.7和3.3之间的区别)。

  • 我正在用Java开发一个时间关键型算法,因此没有使用。为了处理舍入误差,我设置了一个误差上限,在这个上限之下,不同的浮点数被认为是完全相同的。现在的问题是,这个界限应该是什么?或者换句话说,当对浮点数(浮点数加、减、乘、除)执行计算操作时,可能出现的最大舍入误差是什么? 通过我做的一个实验,似乎的范围就足够了。 PS:这个问题与语言无关。 编辑:我使用的是数据类型。这些数字是通过的方法生成的。 编

  • 问题内容: 我面临该功能的奇怪行为: 此代码打印: 我希望浮动值总是四舍五入,但是取整到最接近的偶数。 为什么会出现这种行为?获得正确结果的最佳方法是什么? 我尝试使用,但结果是相同的。 问题答案: “ 数字类型” 部分明确记录了此行为: x 四舍五入为n位数字,四舍五入为偶数。如果省略n,则默认为0。 注意 四舍五入到一半 。这也被称为 银行家四舍五入 ; 通过四舍五入到最接近的 偶数, 您可以