在浮点数学中将数字除以除数时,如果结果不是积分浮点数

When dividing a number by its divisor in floating point math, when if ever is the result not an integral float

提问人:peter duffy 提问时间:8/24/2020 最后编辑:juanpa.arrivillagapeter duffy 更新时间:8/24/2020 访问量:200

问:

当我在 python 中运行此代码时

def is_cool(n):
    if (n/7).is_integer():
        return True
    else:
        return False

for i in range(0,1000000,7):
    if not is_cool(i):
        print(i, " is where the error is")

它不打印任何东西。我知道在某些地方,浮点数学永远是正确的。这是其中之一吗?

python-3.x 除法 浮点精度

评论

0赞 Delrius Euphoria 8/24/2020
你能包括,你期望什么与你得到什么吗?还有为什么不使用%
2赞 juanpa.arrivillaga 8/24/2020
@TomKarzes我认为 OP 要问的是,浮点数除以它的除数之一保证会产生整数浮点数。我认为这是有保证的,但我对 IEEE 754 的了解还不够多(完全不够)
2赞 Tom Karzes 8/24/2020
@juanpa.arrivillaga 嗯,你可能是对的。如果分子和分母都是整数,并且都可以精确表示(即它们不会太大),那么使用适当的除法器,我期望得到确切的结果。
0赞 chtz 8/24/2020
如果是一个整数可以表示为浮点数IEEE754则它的所有整数除数也是可表示的。但是,您的测试将产生许多误报,例如,每个(双精度)浮点数大于整数,因此您的测试对于大数字将变得毫无意义。n2**53

答:

0赞 user13897142 8/24/2020 #1

(n/7).is_integer()仅在以下情况下返回Truen%7===0

现在,您从步长07

你的将是i0, 7, 14, 21, ...

is_cool(i)将始终返回如上所述的每个值,但在您所说的条件下,将始终如此,因此代码不会打印任何内容Trueiifif not is_cool(i)False

评论

1赞 juanpa.arrivillaga 8/24/2020
这并不能解决问题。他们问有没有一种情况不是这样,即,如果一个积分浮点数被另一个积分浮点数除以另一个积分浮点数,而另一个积分浮点数是它的除数,结果会一直是一个积分浮点数吗?我相信这是有保证的,但我对浮点表示的了解还不够多,无法回答
1赞 8/24/2020
哦。。。实际上问题语言不够相关,所以我认为这个问题与打印错误有关
4赞 user2357112 8/24/2020
“(n/7).is_integer() 仅在 n%7===0 时返回 True” - 由于舍入错误,不为 true。例如,n3**60,它仍然给出 True。
0赞 peter duffy 8/24/2020
@user2357112supportsMonica哇,谢谢!你知道吗,或者你是如何找到一个例子的?
4赞 user2357112 8/24/2020
@peterduffy:我刚刚选了一个不能被 7 整除的非常大的数字。当浮点除法的结果足够大时,结果将始终为整数,因为 IEEE 754 binary64 格式不能表示任何大于 2**52 的有限非整数值。
2赞 Eric Postpischil 8/24/2020 #2

IEEE-754 将一个数字除以除数之一将返回一个精确的结果。

IEEE 754-2008 4.3 说:

...除非另有说明,否则每个操作都应像首先产生一个精确到无限精度且范围无限的中间结果一样执行,然后根据本子句中的属性之一对该结果进行舍入。

当中间结果可表示时,所有舍入属性都会将其舍入到自身;舍入仅在值不可表示时才会更改该值。5.4 中给出了划分规则,它们没有说明上述情况的例外情况。

将可表示数除以可表示除数所得到的商必须是可表示的,因为它的有效位数不能比分子多。因此,将一个数字除以其除数之一将返回一个确切的结果。

请注意,此规则适用于作为除法的实际操作数的数字。当源代码中有一些数字(如 )时,这些数字将首先转换为数字格式。如果它们不能以该格式表示,则必须生成一些近似值。这与该部门的运作方式是两个不同的问题。1234567890123456890 / 7