(新手程序员)mod(3^146, 293) 等在 Matlab 和 JS 中返回相同的错误值

(Novice Programmer) mod(3^146, 293) among others returning the same incorrect values in Matlab and JS

首先注意mod(3^146,293)=292。由于某种原因,在 Matlab returns 275 中输入 mod(3^146,293)。在 JS returns 275 中输入 Math.pow(3,146) % 293。同样的错误发生(如据我所知)每次。这让我相信我错过了一些明显但似乎无法说出的东西。

非常感谢任何帮助。

Math.pow(3, 146) 比 JavaScript 中的常量 Number.MAX_SAFE_INTEGER 大,它表示可以表示的数字上限而不会丢失任何精度。因此 JavaScript 无法在 64 位限制内准确表示 Math.pow(3, 146)。

MatLab 对其整数大小也有限制,但可以使用 Symbolic Math Toolbox 表示大数。

您还可以实施 algorithms 来实现此目的而不会溢出。

this related question, MATLAB uses double-precision floating point numbers by default, which have limits on their resolution (i.e. the floating point relative accuracy, eps) 的答案中所述。例如:

>> a = 3^146

a =

     4.567759074507741e+69

>> eps(a)

ans =

     7.662477704329444e+53

在这种情况下,3146在1069的量级,相对精度在10[=的量级21=]53。只有 16 位精度,double 无法存储任意 70 位整数的精确整数表示。

MATLAB 中的另一种方法是使用 Symbolic Toolbox 创建具有更高分辨率的符号数字。这给了你期望的答案:

>> a = sym('3^146')

a =

4567759074507740406477787437675267212178680251724974985372646979033929

>> mod(a, 293)

ans =

292