(Новичок Программист) мод (3 ^ 146, 293), среди прочего, возвращает те же неверные значения в Matlab и JS - PullRequest
0 голосов
/ 26 сентября 2018

Первое замечание, что mod (3 ^ 146,293) = 292.По какой-то причине при вводе mod (3 ^ 146,293) в Matlab возвращается 275. При вводе Math.pow (3,146)% 293 в JS возвращается 275. Такая же ошибка возникает (насколько я могу судить) каждый раз.Это приводит меня к мысли, что я упускаю что-то очевидное, но не могу сказать, что.

Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Как обсуждалось в ответах на этот связанный вопрос , MATLAB по умолчанию использует числа с плавающей запятой двойной точности, которые имеют ограничения по их разрешению (то есть относительная точность с плавающей запятой eps).Например:

>> a = 3^146

a =

     4.567759074507741e+69

>> eps(a)

ans =

     7.662477704329444e+53

В этом случае 3 146 порядка 10 69 , а относительная точность порядка 10 53 .Имея только 16 цифр точности, double не может хранить точное целочисленное представление произвольного 70-значного целого числа.

Альтернативой в MATLAB является использование Symbolic Toolbox для создания символических чиселс большим разрешением.Это дает вам ожидаемый ответ:

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

a =

4567759074507740406477787437675267212178680251724974985372646979033929

>> mod(a, 293)

ans =

292
0 голосов
/ 26 сентября 2018

Math.pow (3, 146) больше, чем константа Number.MAX_SAFE_INTEGER в JavaScript, которая представляет верхний предел чисел, которые могут быть представлены без потери какой-либо точности.Поэтому JavaScript не может точно представлять Math.pow (3, 146) в пределах 64-битного ограничения.

MatLab также имеет ограничения на целочисленный размер, но может представлять большое число с помощью Symbolic Math Toolbox.

Существуют также алгоритмы , которые вы можете реализовать для достижения этой цели без переполнения.

...