Ответ на весь вопрос о точности с плавающей запятой уже получен, но вы все еще видите проблему, несмотря на bignum
.Зачем?Виновником является printf
.bignum
это мелкая прагма.Это влияет только на то, как числа представлены в переменных и математических операциях.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}}} 1006 * берет ваше точное число и превращает его обратно в неточное число с плавающей точкой.просто print
и у них все должно получиться.Вам придется форматировать их вручную.
Другая вещь, которую вы можете сделать, это перекомпилировать Perl с -Duse64bitint -Duselongdouble
, что заставит Perl внутренне использовать 64-битные целые числа и long double
числа с плавающей запятой.Это даст вам гораздо больше точности, более согласованно и почти без затрат на производительность (bignum
немного повышает производительность для математически интенсивного кода).Он не на 100% точен, как bignum
, но влияет на такие вещи, как printf
.Однако такая перекомпиляция Perl делает его двоичным несовместимым, поэтому вам придется перекомпилировать все ваши расширения.Если вы сделаете это, я предлагаю установить новый Perl в другом месте (/usr/local/perl/64bit
или где-то еще), а не пытаться управлять параллельными установками Perl, использующими одну и ту же библиотеку.