(新手程序员)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
首先注意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