看板 C_and_CPP 關於我們 聯絡資訊
c和c++的/和% 並不是常見的除法定義 例如下面這兩行 printf("5/3 = %d...%d\n", 5/3, 5%3); printf("(-5)/3 = %d...%d\n", (-5)/3, (-5)%3); 會跑出 5/3 = 1...2 (-5)/3 = -1...-2 我實在是想不到在什麼情況下 需要讓我的餘數是負的 // 反觀python的//和% 定義就和數學上常用的定義一樣 請問當初究竟為什麼要把/和%定義成這樣? 我試著google過了 沒找到答案orz -- 小妹妹:「大哥哥~你說的魔法棒在哪裡呀~??」 大哥哥:「在這裡啊~!(掏出魔法棒)妳看妳看,牠會自己長大喔~」 小妹妹:「哇!!真的耶!用這個就可以長大嗎~?怎麼用啊~?」 大哥哥:「來!手給我,對對,就是擺在那裡,輕輕的上下移動...對對!就是這樣!」 小妹妹:「這樣嗎@.@?上下移動?好好玩喔~哈哈~又變大了耶~」 大哥哥:「對對!喔..喔..對了!等等會有魔法藥劑跑出來,要喝掉它才有效果喔~」 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.229.87 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1525195247.A.308.html
alan23273850: https://goo.gl/Ng8XwH 怎麼會沒答案 05/02 02:46
之前打英文關鍵字 也沒找到這篇orz 有看到其他人問 但回答都答非所問 例如叫大家小心c/c++的%不是數學上的餘數定義之類的
LPH66: 其實就是除法的商要 trunc() 還是 floor() 的差別 05/02 02:47
LPH66: C/C++ (在 C99/C++11 之後) 取 trunc(), Python 取 floor() 05/02 02:47
我想知道的是為什麼要取trunc() 因為取trunc() 對程式語言的使用者來說 一點好處也沒有 就像我也可以引入一種新的取餘運算 定義除以某個正整數m的時候 餘數在m+7122到2m+7121之間 可是這種運算就是增加使用者的麻煩而已
alan23273850: stackoverflow 裡面主要的理由是處理器實作方便 05/02 02:48
alan23273850: 你遇到負號,是用正除法再取負號比較方便,還是按照 05/02 02:48
alan23273850: 數學上的定義再進位一次變成正數比較方便呢? 05/02 02:49
LPH66: 而且會取 trunc() 其實也是因為處理器實作多這樣做的關係 05/02 02:50
LPH66: 在 C99/C++11 之前 C/C++ 是不規定你要怎麼取的 05/02 02:50
LPH66: 就是處理器怎麼做我們就怎麼做的意思 05/02 02:51
LPH66: 話說回來我看起來 python 好像是反過來定, 先定餘數恆非負 05/02 02:53
LPH66: 然後據此定義整數除法; C/C++ 則是先定整數除法如何處理 05/02 02:54
LPH66: 再據此定義餘數, 所以方向上就會不一樣 05/02 02:54
所以結論是 為了加速/和%的計算速度 c/c++只好規定 一個負整數除以正整數m 對商取trunc()而讓餘數介於-m+1到0之間? 聽起來不是沒有道理 但是我好失望QAQ ※ 編輯: xavier13540 (140.112.229.87), 05/02/2018 07:52:45
MOONRAKER: 不是規定吧 是隨便processor怎麼做 05/02 14:58
ThomasHuang: 有什麼好失望的,如果連這麼簡單的語言特性都沒有辦 05/02 18:28
ThomasHuang: 法掌握,不符合傳統數學的東西就覺得不合理,那可能 05/02 18:28
ThomasHuang: 還是不要寫C比較好 05/02 18:28
alan23273850: 我的關鍵字: why cpp division negative remainder 05/02 23:27
alan23273850: remainder 要打出來 05/02 23:27