2024-05-29 07:38:35 发布
网友
OCamlmod中的模函数返回结果与python中的模运算符不同。
mod
OCaml:
# -1 mod 4 - : int = -1
Python:
>>> -1 % 4 3
为什么结果不同?。
在OCaml中是否有任何标准模块函数作为%运行?。
%
模的语义与整数除法的语义相联系(一般来说,如果Q是整数除法的结果a / b,而R是a mod b的结果,那么a = Q * b + R必须始终为真),因此,不同的整数除法结果舍入为整数的方法将为模产生不同的结果。
Q
a / b
R
a mod b
a = Q * b + R
维基百科的文章Modulo operation有一个关于不同语言如何处理模的非常广泛的表。有几种常见的方法:
在C、Java、OCaml等语言中,整数除法向0舍入,这导致模的结果始终与被除数具有相同的符号。在这种情况下,红利(-1)是负的,所以模也是负的(-1)。
在Python、Ruby和许多其他语言中,整数除法总是向下舍入(朝着负无穷大),这导致模的结果总是与除数有相同的符号。在这种情况下,除数(4)是正的,所以模也是正的(3)。
Python在使用%运算符方面有点不同,它真正计算两个值的模,而其他编程语言使用相同的运算符计算余数。例如,方案中的区别很明显:
(modulo -1 4) ; modulo => 3 (remainder -1 4) ; remainder => -1
在Python中:
-1 % 4 # modulo => 3 math.fmod(-1, 4) # remainder => -1
但在OCaml中,只有mod(它计算整数余数),根据这个table,如documentation所述:
-1 mod 4 (* remainder *) => -1
当然,您可以根据remainder实现自己的modulo操作,如下所示:
remainder
modulo
let modulo x y = let result = x mod y in if result >= 0 then result else result + y
模的语义与整数除法的语义相联系(一般来说,如果
Q
是整数除法的结果a / b
,而R
是a mod b
的结果,那么a = Q * b + R
必须始终为真),因此,不同的整数除法结果舍入为整数的方法将为模产生不同的结果。维基百科的文章Modulo operation有一个关于不同语言如何处理模的非常广泛的表。有几种常见的方法:
在C、Java、OCaml等语言中,整数除法向0舍入,这导致模的结果始终与被除数具有相同的符号。在这种情况下,红利(-1)是负的,所以模也是负的(-1)。
在Python、Ruby和许多其他语言中,整数除法总是向下舍入(朝着负无穷大),这导致模的结果总是与除数有相同的符号。在这种情况下,除数(4)是正的,所以模也是正的(3)。
Python在使用
%
运算符方面有点不同,它真正计算两个值的模,而其他编程语言使用相同的运算符计算余数。例如,方案中的区别很明显:在Python中:
但在OCaml中,只有
mod
(它计算整数余数),根据这个table,如documentation所述:当然,您可以根据
remainder
实现自己的modulo
操作,如下所示:相关问题 更多 >
编程相关推荐