Python中//整数除法与/普通除法在考拉兹迭代计算中的结果差异疑问
两种除法结果不一致的核心原因
核心原因是两种除法的返回类型和精度特性存在本质差异,在超大整数运算场景下表现完全不同:
- 整数除法
//运算逻辑//是整数向下取整除法,返回结果始终为Python的int类型,而Python原生支持任意精度的大整数运算,只要内存足够就不会丢失精度。你的代码全程按照考拉兹序列的规则精确计算每一步的值,得到的1754是准确的运算步数。 - 普通除法
/运算逻辑/是浮点数除法,返回结果为Python的float类型(对应底层双精度浮点数)。双精度浮点数仅能精确表示绝对值小于2^53的整数,超过这个范围的整数会因为有效位不足被截断舍入,无法保留精确值。
你的初始值2**221 + 1远大于2^53,第一次执行x = x/2时结果就已经丢失了低位精度,后续的x%2奇偶判断完全基于错误的数值,甚至会在运算过程中被直接舍入为更小的数值,提前触发x == 1的退出条件,得到的229是精度丢失后的错误结果。
举个简单的验证例子:在Python中执行
(2**60 + 1) % 2会返回1,而执行float(2**60 +1) %2会返回0.0,就是因为超大整数转浮点数时精度丢失,奇偶性判断直接出错。
内容的提问来源于stack exchange,提问作者algebroo
相关产品推荐
相关产品推荐

