2015-01-14 2 views
0

Я имею дело с произвольно большими числами в MATLAB, я некоторое время искал скрипт и, наконец, узнал, что моя проблема wasn ' t логическая ошибка.2^63 - 1 == 2^63, прецизионные ошибки в MATLAB 2012a

Именно это:

>> 2^63 - 1 == 2^63 

ans = 

    1 

В MATLAB 2012a, без дополнительных библиотек, есть способ справиться с большим количеством до 2^100?

Edit:
Видимо, точность ошибка происходит, как только 2^54.

Второй Edit:
По Peter, я могу использовать vpa. Это фактически решает проблему довольно хорошо:

>> vpa(sym(2^63)) - vpa(sym(2^63) - 1) 

ans = 

1.0 
+0

Возможный дубликат: http://stackoverflow.com/questions/588004/is-floating-point-math-broken – Peter

+1

Вы рядом. Если вы представляете целое число с переменной с плавающей запятой, то максимальное целое число, которое вы можете представить без ошибок, равно 2^53. См. [Flintmax] (http://it.mathworks.com/help/matlab/ref/flintmax.html). –

+2

Зависит от того, что вы подразумеваете под «дополнительными библиотеками». Symbolic Math Toolbox предоставляет 'vpa' (арифметику с переменной точностью) для этого – Peter

ответ

3

Команда vpa предоставляется как часть символической математической панели инструментов. Он выполняет математику «бесконечной точности», используя числовое представление, отличное от значений с плавающей запятой, характерных для процессора. Это означает, однако, что арифметика будет МНОГО медленнее, и эти числа занимают гораздо больше места.

+1

'vpa' не имеет бесконечной точности, но вы можете указать нужную вам точность. Проверьте «цифры». Если доступно 'vpa', это, безусловно, лучшее решение. – Daniel

1

Matlab поставляется с JRE. Используйте java-класс java.math.BigDecimal для работы.

Смежные вопросы