【发布时间】:2020-03-22 16:23:20
【问题描述】:
我正在阅读 R5RS 规范和it shows this:
(modulo 13 4) ===> 1
(remainder 13 4) ===> 1
(modulo -13 4) ===> 3
(remainder -13 4) ===> -1
(modulo 13 -4) ===> -3
(remainder 13 -4) ===> 1
(modulo -13 -4) ===> -1
(remainder -13 -4) ===> -1
(remainder -13 -4.0) ===> -1.0 ; inexact
这是正确的吗?我认为模数和余数仅在减号上有所不同。这里显示(modulo -13 4) 应该返回 3,在 JavaScript 中它返回 1。
计算模数和余数的正确算法是什么?我在 JavaScript 实现中的 Scheme 中需要这个。
我在 quora 找到了此代码。
function modulo(num1, num2) {
if (num2 === 0 || isNaN(num1) || isNaN(num2)) {
return NaN;
}
var isPositive = num1 >= 0;
num1 = Math.abs(num1);
num2 = Math.abs(num2);
while (num1 >= num2) {
num1 = num1 - num2;
}
return isPositive ? num1 : -num1;
}
但它不像在 R5RS 规范中那样工作,它为 modulo(-13, 4) 返回 -1。我还认为 JavaScript 的 % 与 remainder 相同。如何在 JavaScript 或 Scheme 中实现这两个功能?
我的确切问题是:这两个函数的算法应该是什么样的,或者计算它们的 JavaScript 代码应该是什么样的?
【问题讨论】:
-
这是正确的吗?是的。如here 中所述,不同的语言对模运算和余数运算的定义不同。
-
@ÓscarLópez 你知道这 3 是正确的还是只是规范中的错字?
-
没错,只要在任何符合规范的实现中尝试。 Javascript 只是做不同的事情,你必须调整它以匹配 Scheme 的规范。还可以看看这个post,Python 在这方面与 Scheme 类似,它将帮助您了解模数的计算方式和原因以不同的方式计算。
-
@ÓscarLópez 问题是我不明白这应该如何实现,我只看到规范中的示例,没有任何解释。 R5RS ch 6.2.5
-
您自己的链接提供了解释, 示例。我已经编辑了您的问题以添加更精确的链接,请查看。 :)
标签: javascript scheme modulo r5rs language-implementation