1

我偶然发现了一个非常奇怪的错误。阅读代码中的注释以了解究竟是什么错误,但本质上是一个模 1 的变量返回 1(但它不等于 1!)。我假设有一个显示问题,浮动非常接近一但不完全。但是,它应该模数为零。我不能轻易测试这种情况,因为 (last % 1) != 1.0 !当我尝试将相同的数字插入另一个 python 终端时,一切正常。这是怎么回事?

def r(k,i,p):
    first = i*p
    last = first + p

    steps = int((i+1)*p) - int(i*p)
    if steps < 1:
        return p
    elif steps >= 1:
        if k == 0:
            return 1 - (first % 1)
        elif k == steps:
            if i == 189:
                print last, 1, type(last), last % 1, last - int(last)
                # Prints: 73.0 1 <type 'float'> 1.0 1.0
                print last % 1 == 1 # Returns False
            if last % 1 == 1.0:
                return 0
            return (last % 1)
        else:
            return 1
4

5 回答 5

6

打印不显示存储的数字的完整精度,您可以使用它repr()来执行此操作

>>> last=72.99999999999999
>>> print last, 1, type(last), last % 1, last - int(last)
73.0 1 <type 'float'> 1.0 1.0
>>> print last % 1 == 1
False
>>> print repr(last), 1, type(last), repr(last%1), repr(last - int(last))
72.999999999999986 1 <type 'float'> 0.99999999999998579 0.99999999999998579
>>> 
于 2010-02-24T02:53:34.000 回答
6

欢迎来到 IEEE754,祝您逗留愉快。

于 2010-02-24T02:35:05.270 回答
3

您应该使用 math.fmod(x, y)。这是http://docs.python.org/library/math.html的摘录:

“请注意,Python 表达式 x % y 可能不会返回相同的结果。C 标准的意图是 fmod(x, y) 精确地(数学上;无限精度)等于 x - n*y 对于某个整数 n使得结果与 x 具有相同的符号并且幅度小于 abs(y)。Python 的 x % y 返回带有 y 符号的结果,并且可能无法精确计算浮点参数。例如,fmod(-1e -100, 1e100) 是 -1e-100,但是 Python 的 -1e-100 % 1e100 的结果是 1e100-1e-100,不能完全表示为浮点数,四舍五入到令人惊讶的 1e100。因此,函数处理浮点数时通常首选 fmod(),而处理整数时首选 Python 的 x % y。”

于 2010-02-24T12:47:00.033 回答
1

您可以尝试使用math.fmod函数而不是last % 1,也许它更适合您的问题。或者你可以在整数空间中重新表述你的问题。

无论如何,使用相等运算符比较浮点值并不是一个好习惯==,因为即使是看似微不足道的操作也会产生不精确的结果,例如0.1 + 0.2 == 0.3

于 2010-02-24T08:33:34.170 回答
0

如果您需要任意精度,那么有一些项目可以做到这一点。gmpy处理多精度整数,mpmath看起来相当不错,而bigfloat则包装了 MPFR。通过 gnibbler 的回答,您所拥有的可能就足够了,但是,以防万一。

于 2010-02-24T03:02:53.827 回答