楼层功能与楼层划分的区别

ana*_*ark 2 python python-3.x

为什么以下操作的答案不一样,而且,既然//本质上是楼层划分,那么为什么在使用楼层函数时输出不同。

我运行了以下代码:

import math
x = 2**64 -1
print("Original value:", x)
print("Floor division:", x//1)
print("Floor function:", math.floor(x/1))
print("Trunc function:", math.trunc(x/1))
print("Type conversion:", int((x/1)))
Run Code Online (Sandbox Code Playgroud)

输出:

Original value: 18446744073709551615
Floor division: 18446744073709551615
Floor function: 18446744073709551616
Trunc function: 18446744073709551616
Type conversion: 18446744073709551616
Run Code Online (Sandbox Code Playgroud)

现在,为什么答案不等于原始值,因为我所做的只是除以 1?

Jul*_*ien 5

/转换为浮点数。而且浮点运算具有固有的数值误差。一旦您输入,x/1您就可能会在 的原始值上引入错误x。一旦错误出现,你基本上就无法恢复它。

这比整数下限问题更广泛:

x = 2**70 + 123
print(x-int(x/1))

123
Run Code Online (Sandbox Code Playgroud)


Sha*_*ger 5

float是 64 位 IEEE-754 二进制浮点值;它只有 53 位的整数精度(除此之外,它被困在基于将整数值乘以 2 的幂的不精确近似值),并且当您除以时将 64 位值放入其中1float在最终调用round/ trunc)。基本上,它使float值尽可能接近int您使用的值,不幸的是它不等于int(因为这是不可能的),然后四舍五入/截断它(鉴于该值没有小数部分,只是意味着转换回等值int)。

楼层除法 with//从来没有问题,因为它是一个纯粹int基于除法(没有任何东西被表示为 a float),并且ints (在计算机内存的限制下)实际上是无限精度。