чтение и хранение чисел в perl без потери точности (Perl)

У меня есть несколько чисел в файле в различных форматах: 8,3, 0,001, 9e-18. Я ищу простой способ прочитать их и сохранить без потери точности. Это было бы легко сделать в AWK, но как это сделать в Perl? Я открыт только для использования Perl. Спасибо!

Кроме того, мне было интересно, есть ли простой способ распечатать их в соответствующем формате. Например, 8.3 следует печатать как «8.3», а не как «8.3e0».


person Asher Walther    schedule 23.04.2012    source источник


Ответы (2)


Если это текстовые строки, то чтение их в Perl как строк и запись обратно в виде строк не должны приводить к потере точности. Если вам нужно выполнить над ними арифметические действия, я предлагаю установить модуль CPAN Math::BigFloat, чтобы гарантировать, что вы не потеряете точность при округлении.

Что касается вашего второго вопроса, Perl не выполняет никакого переформатирования, если вы не попросите его:

$ perl -le 'print 8.3'
8.3

Я что-то упускаю?

person Mark Reed    schedule 23.04.2012

Из http://perldoc.perl.org/perlnumber.html:

Perl может внутренне представлять числа тремя различными способами: как собственные целые числа, как собственные числа с плавающей запятой и как десятичные строки. Десятичные строки могут иметь экспоненциальную часть записи, как в «12.34e-56». Native здесь означает «формат, поддерживаемый компилятором C, который использовался для сборки Perl».

Это означает, что печать числа зависит от того, как число хранится внутри perl, что, в свою очередь, означает, что вы должны знать, как число представлено на входе.

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

 $ perldoc -f int

 int EXPR

      int  Returns the integer portion of EXPR.  If EXPR is omitted, uses $_.  You should
      not use this function for rounding: one because it truncates towards 0, and two
      because machine representations of floating-point numbers can sometimes produce
      counterintuitive results.  For example, "int(-6.725/0.025)" produces -268 rather than
      the correct -269; that's because it's really more like -268.99999999999994315658
      instead.  Usually, the "sprintf", "printf", or the "POSIX::floor" and
      "POSIX::ceil" functions will serve you better than will int().

Я думаю, что если вы хотите явно прочитать число в виде строки, лучше всего использовать unpack() с форматом «A *».

person Barton Chittenden    schedule 23.04.2012