






















这是一个创建于 564 天前的主题,其中的信息可能已经有所发展或是发生改变。
1 mightybruce 2024 年 11 月 28 日这个取余运算的确在数学上是没有负数,这个的确没有问题。毕竟搞计算机的很多数学水平一般,这也很正常。 读计算机科学里面一些分支的博士,就会发现基本没有本科学计算机的了, 尤其是密码学、数值分析这些。 |
2 mark2025 2024 年 11 月 28 日py 真是性能亡者~ |
3 codehz 2024 年 11 月 28 日本身就是定义学的问题,太过纠结这种东西没意义。。。 |
4 mightybruce 2024 年 11 月 28 日数学要求体系必须是自洽的, 不像计算机学科,当然数学有一点不行,就是数学符号乱飞,不同体系下的同一个数学符合意思都不一样。 |
5 mightybruce 2024 年 11 月 28 日@mark2025 python 也不是非常拉跨,pypy 是 python jit 解释器, 只不过 python 默认的 cpython 那是运行效率低。 |
6 Eureka0 2024 年 11 月 28 日数论里面 -1 与 2 是模 3 同余的,属于同一个同余类,取余等于多少,就是一个怎么选同余类代表数的定义问题,Python 选最小非负整数集(最小剩余系),C 选 {-[n/2], ..., [n/2]+1},数学上其实都没有问题 |
7 dnfQzjPBXtWmML 2024 年 11 月 28 日C 不是给无能巨婴用的语言,溢出、越界、CPU 的特性都开放给你,不懂搞出问题了是你自己的问题。 |
8 FalconD 2024 年 11 月 28 日 via Android这就是个定义问题,下面是 Haskell 标准库的结果: |
10 FalconD 2024 年 11 月 28 日 via Android在这种意义下 C 的行为没有问题 因为 -1/3 + -1%3 == -1 |
11 zzzsy 2024 年 11 月 28 日 via Android除法又不是只有欧几里得除法一种 |
12 48y1951r9G8k7Zou 2024 年 11 月 28 日编程语言提供的基本数学运算是方便开发者编写程序的,而不是用来进行数学研究的。要想做后者,应当使用专门的软件(比如 Scilab ) 非得要求编程语言中的概念在数学上“正确”,无异于耍流氓 ---- 题外话,有“数学洁癖”的人最常吐槽的是众多编程语言的“变量”,完全跟数学上的“变量”是不同的东西 不过在这一点上 C 语言并没有中枪,因为 C 语言并没有“变量”这一概念(翻一翻标准手册,会发现 variable 这个词唯一出现在的地方是 VLA ) |
13 wakarimasen 2024 年 11 月 28 日无奖竞猜:有一种主流编程语言 0/0 不会抛出异常且可以得到合法返回值 |
14 ZE3kr 2024 年 11 月 28 日错的多了就成标准了。HTTP 里 referrer 错误拼写成了 referer ,但现在用的都是错误的拼写 |
15 secondwtq 2024 年 11 月 28 日这些语言的行为在它们自己的体系里是自洽的——比如 C 的浮点数转整数会直接把浮点部分切掉,而 C 的除法,商也是把浮点部分切掉,然后根据此算出余数。如果用传统香烟,啊不传统余数,那同时算出的商和余数会不满足 商*除数+余数=被除数 这一基本原则,这个问题显然更严重。 C 标准库对浮点数还定义了 fmod() 和 remainder() 两个函数,两个采取了不同的定义,remainder() 函数对应的是 IEEE 754 标准定义的 remainder 操作。fmod() 函数我没有在标准里找到对应。 Python 虽然浮点强转整数也是切,但是貌似实际用得不多,默认的 / 不能整除时直接给浮点,// 和 % 也是一致的。 至于拿计算机语言强行追求贴合数学定义我觉得大可不必,光浮点数就很头疼。等下个 IEEE 754 标准更新之后,可能会有很多符合该标准的实现,但是可能大多数人不会用。 |
16 coderluan 2024 年 11 月 28 日作者说只有 python 是对的,其他语言是错的,从数学的角度我并不反对。 但是作者说其他编程语言是因为 C 语言这么做,所以才跟着这么做的。我感觉作者有点太不看不起其他编程语言了吧,那其他语言和 C 语言不一致情况怎么解释,其他语言这会又不怕了吗?这就是明显的拉踩行为啊。 |
17 cooltechbs 2024 年 11 月 28 日谈数学怎么能不提 Fortran ,Fortran 是怎么处理的(我真的不懂,真心发问)? |
18 vvhy 2024 年 11 月 28 日两种定义在数学上都是自洽的 |
19 secondwtq 2024 年 11 月 28 日我记得这个问题我很久之前折腾过,不过具体怎样忘了(当时也没搞 Numerics ),我翻了一下记录,有这么一篇论文: 所以可能还真不是 C 带的头。至于是不是真的 Fortran 先干的我也不确定( Fortran 66 标准里面我没找到,77 里面倒是有,不过那时候已经有原始的 C 了),但是考古只考到 C 大概是不合格的,就算暴论也没上面那个 thread 有活。 |
20 geelaw 2024 年 11 月 28 日C 语言规定 a / b 的值 q 是 a 除以 b 向零取整,而 a % b 是满足 a = qb + r (带余除法恒等式)惟一的 r 。 C 语言: 数论: 带余除法恒等式相当重要且自然,如果丧失它则扩展欧几里得算法 [给定 a, b 计算 x, y 使 ax+by=(a,b)] 会很难写对。以下三者不可兼得: 1. 带余除法恒等式 值得注意的是 Python 也没有完全采用数论中常见的定义,因为 Python 里 a % b 的符号是 0 或者和 b 相同(整数的情况),而不是永远非负。 C 和 Python 都不是“常见数论教材”纯粹的。数学上对余数的选择没有某种必然的对错,通常选 (-b, b) 里的任何数都不会导致常见的算法(如欧几里得算法)无法继续。 C 语言选择向零取整、保持带余除法恒等式,虽然 a % b 可能有负数,但是保证了 -a/b -(a/b) 的计算结果都相同(假设 a 不是 int 最小值且 b 不是 0 )。而在 Python 里面,对于整数 a,b ,表达式 -a//b 和 -(a//b) 的两组结果分别相同,但组间可以不同,不同当且仅当 a/b 是负非整数。 |
21 favourstreet 2024 年 11 月 28 日 via Android兄弟们,还是看一看实部或者虚部有一个是浮点数∞的时候都复数乘法该怎么算吧,我支持单点紧化 |
22 NessajCN 2024 年 11 月 28 日定义问题 |
24 laikicka 2024 年 11 月 28 日无所谓 PHP 会出手 |
25 edwardzcn98 2024 年 11 月 28 日应该只是定义不同,无关对错,哪里来的 python 精神可敬。。以下是 Lean 中求余的表达,官方也解释早期用 truncation-rounding 定义,后来用的 euclidean 定义。表达数学能力有差别,所以才改。 这篇文章解释了几种定义下的除法和求余 ```lean4 -- using emod (euclidean division) -- using tmod (truncating division) |
26 edwardzcn98 2024 年 11 月 28 日这个算是标答了。以及#19 提到了同样一篇文章 |
29 paopjian 2024 年 11 月 28 日这种拉一捧一的不是来秀优越性的么,计算机领域尊重数学某一学派就叫对,不遵守就叫错? 那看来编程语言有精度问题就可以说不配存在了 |
32 cybort 2024 年 11 月 28 日 via Android这个是和取整方法有关的,C 语言取的是向 0 取整的结果,你给出来的是向下取整的结果。如果-1/3+1/3 不等于 0 ,其实更反直觉。运算系统本来就是人为定义的,欧氏空间也不比其他空间跟高贵,关键是哪一种好用。 |
33 Maboroshii 2024 年 11 月 28 日说起来可能有点可笑,我长这么大还没用过负数取模... |
34 xuld 2024 年 11 月 28 日并不是其他语言是错的,而是其他语言管 % 叫取模运算,这些语言规范中从没说 % 是取余运算。只不过取模运算在正数的时候,结果和取余是相同的。 |
35 xuanbg 2024 年 11 月 28 日我个人不太认可数学洁癖的说法,我认为除法向零取整才是符合直觉的。所以 C 的做法没错,Python 反倒是有点矫情了 |
37 InkStone 2024 年 11 月 28 日欧几里得除法是什么玩意儿,你是想说辗转相除法么?这只是一个算法而已,不是什么取模的定义。 事实上你在正经的数学文献里几乎不会看到取模运算这种东西,只有同余恒等式,没有取模运算。这跟编程里的概念是不一样的。 什么是同余恒等式? 7 ≡ 17 ( mod 10 ),这才是数学的东西。 |
38 NoOneNoBody 2024 年 11 月 28 日一个是整除后,跟整除结果的距离。这里还有整除定义的问题,是除法结果的整数部分,还是除法结果向较小方向取整 编程是定义整除为“除法结果的整数部分”,取模为“跟整除结果倍数的距离”,其中余数符号的意义是方向 所以,计算机求“余”的计算,要按实际需求重写算法,而不是单纯用某个表达式替代 |
39 GuuJiang 2024 年 11 月 28 日 via iPhone@InkStone 不了解的东西可以先去检索而不是直接断言,欧几里得除法是个专有概念,维基百科都能查到,另外 rust 语言里的各种数值类型都提供了内置的 div_euclid 和 rem_euclid 方法 |
40 moxuze 2024 年 11 月 28 日数组这个下标,只有 Lua 是对的。当初 Python 这个老师教错了,那么一大票学生也就只敢跟着老师错。只有 Lua 敢于站出来坚持正确答案。 |
46 zeromake 2024 年 11 月 28 日@moxuze lua 下标就是 1 开始,实际上没啥问题,问题在于写 lua 几乎不可能不使用 c 做扩展工作,然后就爽了一会在 c 里用下标 0 ,一会在 lua 里下标 1…… |
47 tabc2tgacd 2024 年 11 月 28 日感觉无需纠结这种问题,用什么语言就按什么语言的规矩来就行了。 |
49 namonai 2024 年 11 月 29 日`%` 在 C 里面也叫取模运算,没人说过这是取余数 |
50 Izual_Yang 2024 年 11 月 29 日经典老番,数学也有自己的“负小数的整数部分”(高斯取整),但是很少有能解释清楚这样定义有何优点的 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。