提问人:peter duffy 提问时间:8/24/2020 最后编辑:juanpa.arrivillagapeter duffy 更新时间:8/24/2020 访问量:200
在浮点数学中将数字除以除数时,如果结果不是积分浮点数
When dividing a number by its divisor in floating point math, when if ever is the result not an integral float
问:
当我在 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")
它不打印任何东西。我知道在某些地方,浮点数学永远是正确的。这是其中之一吗?
答:
0赞
user13897142
8/24/2020
#1
(n/7).is_integer()
仅在以下情况下返回True
n%7===0
现在,您从步长0
7
你的将是i
0, 7, 14, 21, ...
is_cool(i)
将始终返回如上所述的每个值,但在您所说的条件下,将始终如此,因此代码不会打印任何内容True
i
if
if 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。例如,当 n
为 3**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
评论
%
n
2**53