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

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

2
Tejas Rao 26 Сен 2018 в 04:46

2 ответа

Лучший ответ

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

>> a = 3^146

a =

     4.567759074507741e+69

>> eps(a)

ans =

     7.662477704329444e+53

146 69 53

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

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

a =

4567759074507740406477787437675267212178680251724974985372646979033929

>> mod(a, 293)

ans =

292
4
gnovice 26 Сен 2018 в 02:58

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

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

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

2
Thomas C 26 Сен 2018 в 02:40