python-3.x - 长的奇怪的 Python 3 mod 行为
问题描述
考虑这个代码片段。
>>> n, m = 10011617, 100000000000006340
>>> s = lambda n: n * (n + 1) / 2
>>> s(n)
50116242483153.0
>>> s(n) == int(s(n))
True
>>> m % s(n)
18096246116101.0
>>> m % int(s(n))
18096246116105
如您所见,s(n)
是一个整数(数学上),然而m % s(n) != m % int(s(n))
.
这可能与引擎盖下的长期存在有关吗s(n)
?m
即使是这样,为什么s(n) == int(s(n))
当我取模时结果不相等?
PS我在repl.it中运行了这个
解决方案
在这种特殊情况下,问题m
不仅仅是由于s(n)
. 计算时m % s(n)
,因为s(n)
是浮点数,m
所以被强制为浮点数。但是——float(m)
失去精度。看到这一点的最清楚的方法是
m == 100000000000006340
但
int(float(m)) == 100000000000006336
请注意100000000000006336 % 50116242483153 == 18096246116101
,它显示了神秘值的来源。
推荐阅读
- laravel - 如何在cdn上制作laravel echo setup js
- python - 带有f-string和pandas数据框的for循环
- apache-spark - 从技术角度看RDD和Dataset/Dataframe之间的关系
- sql-server - 基于两个 where 子句使用什么代替 union 来加入相同的结果
- typescript - 如何在nuxt中将关联对象数组显示为tbody的td
- android - Android Studio Build Error - NEGOTIATE authentication error: Invalid name provided (Mechanism level: KrbException: Cannot locate default realm)
- angular - 如何在 Angular 模板中对数据进行分组?
- aws-api-gateway - AWS ApiGateway:GUI 中的映射表达式参数无效
- kotlin - 如何为此 Gradle 任务制作插件?
- javascript - 未捕获的 ReferenceError:在 HTMLButtonElement.onclick (index.html:23) 处未定义回声