是 C++和 python2.7 的取整规则导致了他们的余数不一样吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rebeccaMyKid
V2EX    问与答

是 C++和 python2.7 的取整规则导致了他们的余数不一样吗?

  •  
  •   rebeccaMyKid 2017-11-09 18:47:18 +08:00 1929 次点击
    这是一个创建于 2912 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看书遇到这个问题,查了些资料上 SO 问了一下被 marked duplicated 了。(T_T)来问下前辈们。

    先说下我的理解和观察到的现象: 首先我们日常说的带余除法用的是欧几里得带余除法,在 C++和 python 里面都不是这种。 C++里面 m%n 的符号跟 m 相同,python 里面 m%n 符号跟 n 相同。我一开始觉得只是不同 implementation 而已,然后发现好像跟取整的规则有点联系。 py2.7 里似乎是向负无穷取整的

    -21/4 == -6 -(21/4) == -5 -21/4 == -(21/4) //False 

    因为既然定义了 int,那除不尽的时候肯定要设定一个取整规则,那 C++是向 0 取整的,py2.7 似乎是是向负无穷取整的,py3 结果是浮点数没有这个问题。

    我的问题是: 1.取整规则跟余数的选择不同是不是一个因果关系? 2.假设 1 成立(其实我心里已经默认是了 T-T ),接着问为什么 py2.7 要搞这个向负无穷取整,搞得-21/4==-(21/4)都不相等了,书上还说

    C++语言的早起版本允许结果为负值的商向下或向上取整。 (为什么一开始会是这种设定?)

    (看了下 js,没有这个问题,跟 py3 一样是浮点数,但 js 跟 C++一样余数也是跟被除数符号一样的,php 也是)。

    stackoverflow 链接

    8 条回复    2017-11-09 20:07:22 +08:00
    GtDzx
        1
    GtDzx  
       2017-11-09 19:02:08 +08:00   1
    1. 是的。Python 是向负无穷取整,C/C++/Java 是向 0 取整。
    GtDzx
        2
    GtDzx  
       2017-11-09 19:04:27 +08:00   1
    2. Python 这么设计的原因是假设 a/b 商是 q,余数是 r,那么应该有 a = bq + r。 向负无穷取证可以保证 r 是非负的,向 0 取整会导致 r 是负的。
    anmaz
        3
    anmaz  
       2017-11-09 19:05:33 +08:00 via Android
    2 和 3 是有区别的,本身 python 对算术运算就有一些特殊的需求
    rebeccaMyKid
        4
    rebeccaMyKid  
    OP
       2017-11-09 19:15:52 +08:00
    @GtDzx 可是向负无穷取整,python 的余数不也是负的么? 21%-4 在 py2.7 的结果里是-3 啊。。
    rebeccaMyKid
        5
    rebeccaMyKid  
    OP
       2017-11-09 19:17:28 +08:00
        6
    GtDzx  
       2017-11-09 19:25:49 +08:00
    @rebeccaMyKid 哦,上面说的是针对 b 是正数。如果考虑 b 是负数,Python 是这么规定的:
    1. a = bq + r,其中 q = a // b, r = a % b
    2. r 和 b 符号相同
    rebeccaMyKid
        7
    rebeccaMyKid  
    OP
       2017-11-09 19:32:19 +08:00
    @GtDzx 所以当 b 是负值的时候,r 还是负的,那这样向负无穷取整没啥意义啊。只让 b 为正,即使 a 为负的时候,r 能正,这个有什么特别意义么
    rebeccaMyKid
        8
    rebeccaMyKid  
    OP
       2017-11-09 20:07:22 +08:00 via Android
    @GtDzx 看懂文章了,谢谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1027 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 18:51 PVG 02:51 LAX 11:51 JFK 14:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86