8.3、0.001、9e-18のさまざまな形式のファイルにいくつかの番号があります。精度を損なうことなく、簡単に読み込んで保存できる方法を探しています。これはAWKでは簡単ですが、Perlではどのように行われますか?私はPerlを使用することだけにオープンです。ありがとう!
また、適切な形式で印刷する簡単な方法があるかどうか疑問に思いました。たとえば、8.3は「8.3e0」ではなく「8.3」として印刷する必要があります
8.3、0.001、9e-18のさまざまな形式のファイルにいくつかの番号があります。精度を損なうことなく、簡単に読み込んで保存できる方法を探しています。これはAWKでは簡単ですが、Perlではどのように行われますか?私はPerlを使用することだけにオープンです。ありがとう!
また、適切な形式で印刷する簡単な方法があるかどうか疑問に思いました。たとえば、8.3は「8.3e0」ではなく「8.3」として印刷する必要があります
それらがテキスト文字列である場合、それらを文字列としてPerlに読み込み、文字列として書き戻すことで、精度が低下することはありません。それらに対して算術演算を行う必要がある場合は、CPANモジュールMath :: BigFloatをインストールして、丸めの精度が失われないようにすることをお勧めします。
2番目の質問に関しては、Perlは、次のように要求しない限り、再フォーマットを行いません。
$ perl -le 'print 8.3'
8.3
私は何かが足りないのですか?
http://perldoc.perl.org/perlnumber.htmlから:
Perlは、ネイティブ整数、ネイティブ浮動小数点数、および10進文字列の3つの異なる方法で数値を内部的に表すことができます。10進文字列には、「12.34e-56」のように指数表記部分が含まれる場合があります。ここでのネイティブとは、「perlのビルドに使用されたCコンパイラでサポートされているフォーマット」を意味します。
これは、数値を出力することは、数値が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().
数値を文字列として明示的に読み取りたい場合は、「A *」形式のunpack()を使用するのが最善の策だと思います。