Как обсуждалось в ответах на этот связанный вопрос , 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