今天在看一篇公众号文章《性能之王:最快的编程语言》,发现评论区有这么一段对话:

img

img2

然后我找了下在 stackexchange 的真实提问:

https://math.stackexchange.com/questions/623449/negative-number-divided-by-positive-number-what-would-be-remainder

从回答来看,C 和 Python 的两种做法在数值计算上都是成立的。两种做法的区别在于是否允许余数为负数,或者说,符号该不该与原数值相同。

不允许余数出现负数的,是目前广泛使用的欧几里得除法。

所以“数学洁癖”会认为负值余数是错的?

举报· 2511 次点击
登录 注册 站外分享
23 条回复  
mightybruce 小成 2024-11-28 00:00:22
这个取余运算的确在数学上是没有负数,这个的确没有问题。毕竟搞计算机的很多数学水平一般,这也很正常。 读计算机科学里面一些分支的博士,就会发现基本没有本科学计算机的了, 尤其是密码学、数值分析这些。
mark2025 小成 2024-11-28 00:03:54
py 真是性能亡者~
codehz 初学 2024-11-28 00:04:12
本身就是定义学的问题,太过纠结这种东西没意义。。。 连 0 是否是自然数,(类似数组下标从 0 还是从 1 开始)都可以有好多说法 以及 1 是不是素数 我建议从实用主义出发,别去想这种东西哪个“更合理”
mightybruce 小成 2024-11-28 00:12:26
数学要求体系必须是自洽的, 不像计算机学科,当然数学有一点不行,就是数学符号乱飞,不同体系下的同一个数学符合意思都不一样。 计算机本身运算你可以认为都是在有限群上的, 所以取余后是正数是没错的, 另外负数的平方根在计算机中是二次剩余也是正数。
mightybruce 小成 2024-11-28 00:15:16
@mark2025 python 也不是非常拉跨,pypy 是 python jit 解释器, 只不过 python 默认的 cpython 那是运行效率低。
Eureka0 初学 2024-11-28 00:19:40
数论里面 -1 与 2 是模 3 同余的,属于同一个同余类,取余等于多少,就是一个怎么选同余类代表数的定义问题,Python 选最小非负整数集(最小剩余系),C 选 {-[n/2], ..., [n/2]+1},数学上其实都没有问题
dnfQzjPBXtWmML 小成 2024-11-28 00:31:47
C 不是给无能巨婴用的语言,溢出、越界、CPU 的特性都开放给你,不懂搞出问题了是你自己的问题。 觉得 CPU 指令设计有问题可以去 intel/amd 门口举牌子。 从这个上面能总结出 XXX 的多少沾点智慧。
FalconD 初学 2024-11-28 00:39:50
这就是个定义问题,下面是 Haskell 标准库的结果: quotRem 3 2 = (1, 1) quotRem 3 -2 = (-1, 1) quotRem -3 2 = (-1, -1) quotRem -3 -2 = (1, -1) divMod 3 2 = (1, 1) divMod 3 -2 = (-2, -1) divMod -3 2 = (-2, 1) divMod -3 -2 = (-2, -1) 和 LLM 的总结一致 rem: The result has the same sign as the dividend. mod: The result has the same sign as the divisor, or is zero
liprais 小成 2024-11-28 00:44:07
@codehz 大专?
123下一页
返回顶部