当前位置: 首页 > 面试题库 >

为什么在python中,非常大的float值之间的比较会失败?

梁马鲁
2023-03-14
问题内容

以我的理解,sys.float_info.max是最大的浮点值。但是, 似乎无法比较大的值

import math
import sys

m = sys.float_info.max                        # type 'float'

m == m                                        # True
m < m                                         # False
m > m                                         # False

m == m-1.0                                    # True
m < m-1.0                                     # False
m > m-1.0                                     # False

m == m-1e100                                  # True
m < m-1e100                                   # False
m > m-1e100                                   # False

m == m-1e300                                  # False
m > m-1e300                                   # True
m < m-1e300                                   # False

我认为那是因为精度有限吗?如果可以,我可以在什么数值范围内安全操作?

上面的代码是在Python 3.5.2上运行的。


问题答案:

在运行Python的典型计算机上,Python浮点数有53位精度。如果尝试进一步,Python将消除最小的部分,以便可以正确表示数字。

因此,值1被吸收或取消,以便能够代表您要计算的高值。

通过减去(或加)乘以浮点epsilon的值来获得极限。

在我的机器上:

maxfloat == 1.7976931348623157e+308
epsilon == 2.220446049250313e-16

样本测试代码

import math
import sys

m = sys.float_info.max                        # type 'float'
eps = sys.float_info.epsilon

print(m == m-(m*(eps/10)))   # True
print(m == m-(m*eps))        # False

m*eps是您必须减去的最小值,以使比较失败。它总是相对于m价值。



 类似资料:
  • 问题内容: 在JBox2d中,存在以下代码: 我想知道这里的float <-> int位转换函数的作用是什么。这是否提供解决Java的float比较不准确性问题的方法(如果可能的话)?还是完全不同?我想知道它是否可以替代epsilon方法: PS。为了完整和有趣,这里是: 仅供参考,我可以完美地理解为什么在hashCode()中使用转换函数-哈希ID必须是整数。 问题答案: 解释中可以找到约书亚B

  • 问题内容: 在Python中,比较float与几乎相等的最佳方法是什么? 问题答案: Python 3.5添加了PEP 485中描述的和功能。 如果你使用的是Python的早期版本,则等效功能在文档中给出。 是一个相对容差,它乘以两个参数中的较大者;当值变大时,它们之间的允许差异也会变大,同时仍将它们视为相等。 是在所有情况下均按原样应用的绝对公差。如果差异小于这些公差中的任何一个,则认为值相等。

  • 问题内容: 我正在研究为项目使用哪种模拟框架,并将其范围缩小到JMockit和Mockito。 我注意到 Mockito 在 Stackoverflow上 被评为“ Java最佳模拟框架 ”。 在比较 JMockit 的“ 模拟工具比较矩阵 ”上的功能时,看来 JMockit 具有多个不同的功能。 是否有人有 Mockito 可以做到的任何特定信息(无意见),而 JMockit 则无法实现,反之亦

  • 问题内容: 在Python中处理此问题的推荐方法是什么? 当然在某个地方有一个标准的库函数吗? 问题答案: Python 3.5添加了PEP 485中描述的和功能。 如果你使用的是Python的早期版本,则等效功能在文档中给出。 是一个相对容差,它乘以两个参数中的较大者;当值变大时,它们之间的允许差异也会变大,同时仍将它们视为相等。 是在所有情况下均按原样应用的绝对公差。如果差异小于这些公差中的任

  • 本文向大家介绍为什么str(float)在Python 3中比Python 2返回更多的数字,包括了为什么str(float)在Python 3中比Python 2返回更多的数字的使用技巧和注意事项,需要的朋友参考一下 在Python 2.7中,一个float的repr返回最接近十七位数的十进制数;这足以精确地识别每个可能的IEEE浮点值.浮点数的str类似地工作,除了它将结果限制为12位数;对于

  • 问题内容: 输出: 123456789 123456792 问题答案: 该类型使用与(32位)相同的位数表示比仅表示整数更大范围的浮点数。 这会导致精度下降,因为并非每个数字都可以用来精确表示。仅24位用于表示数字的小数部分(包括符号位),而其他8位用于表示指数。 如果将此值分配给,则不会有任何精度损失,因为它具有64位,并且其中32个以上的位用于表示小数。 这是更详细的说明: 123456789