Проблема с округлением MPFR

Я только начал работать с библиотекой произвольной точности MPFR и довольно скоро столкнулся с очень странным поведением. Основная цель его использования заключалась в повышении точности «триггеров» с большими аргументами, и это очень хорошо работает в MPFR.

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

Даже в таком примере, как 1.1 * 1, результат равен 1.10000000000000008881784... И этот результат дан с безумной точностью в 2000 бит (53 в обычном двойном значении)!

Возможно, это проблема моей системы, но даже в онлайн-MPFR есть подобные проблемы. Вы можете попробовать такой пример онлайн: http://ex-cs.sist.ac.jp/~tkouya/try_mpfr.html

1 * 1,1 при 64 битах = 1,10000000000000000002

Но онлайн-версия с повышением точности сдвигает ошибку дальше, а в моей установке - нет.

Моя система: Ubuntu 9.10 + gmp 5.0.0.1 + mpfr 2.4.2


person Denis    schedule 26.02.2010    source источник


Ответы (1)


Похоже, это канонический ответ на проблемы с точностью с плавающей запятой< /а>. Он включает объяснение, почему большее количество битов не решает проблему.

Старый ответ

См. вопрос 7 часто задаваемых вопросов MPFR. В любом случае, всегда будет какая-то ошибка, так как многие числа не могут быть точно представлены двоичными мантиссами, независимо от того, сколько битов вы используете. См. этот ответ на связанный вопрос SO для хорошего объяснения.

person mtrw    schedule 26.02.2010
comment
Благодарю вас! Преобразование float -> string -> bigfloat решило проблему с независимостью ошибки от точности. - person Denis; 26.02.2010