为什么以下操作的答案不一样,而且,既然//本质上是楼层划分,那么为什么在使用楼层函数时输出不同。
我运行了以下代码:
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?
/转换为浮点数。而且浮点运算具有固有的数值误差。一旦您输入,x/1您就可能会在 的原始值上引入错误x。一旦错误出现,你基本上就无法恢复它。
这比整数下限问题更广泛:
x = 2**70 + 123
print(x-int(x/1))
123
Run Code Online (Sandbox Code Playgroud)
float是 64 位 IEEE-754 二进制浮点值;它只有 53 位的整数精度(除此之外,它被困在基于将整数值乘以 2 的幂的不精确近似值),并且当您除以时将 64 位值放入其中1(float在最终调用round/ trunc)。基本上,它使float值尽可能接近int您使用的值,不幸的是它不等于int(因为这是不可能的),然后四舍五入/截断它(鉴于该值没有小数部分,只是意味着转换回等值int)。
楼层除法 with//从来没有问题,因为它是一个纯粹int基于除法(没有任何东西被表示为 a float),并且ints (在计算机内存的限制下)实际上是无限精度。
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |