4

Windows 32 ビット プラットフォームでは、99,999,999,999 という大きな値を持つことができますが、それ以上の値を持つことはできませんでしたが、これは予想外でした。sprintf("%011d", $myNum)それらを試みると、オーバーフローが出力されます: -2147483648 。

この場合、コードを大幅に変更する必要があるため、BigInt モジュールを使用できません。sprintf("%011s", $numero)マイナス記号が正しく処理されないため、文字列としてフォーマットを管理できません。

どうすればこれを管理できますか? パック/アンパックは役に立ちますか?

4

5 に答える 5

11

小数部のないフロートとしてフォーマットしてみてください。

$ perl -v
This is perl, v5.6.1 built for sun4-solaris
...

$ perl -e 'printf "%011d\n", 99999999999'
-0000000001

$ perl -e 'printf "%011.0f\n", 99999999999'
99999999999
于 2009-05-06T11:18:54.837 に答える
1

はい、Perl の数値の盲点の 1 つはフォーマットです。printfPerl は自動的に数値を整数または浮動小数として表現するのをかなりうまく処理しますが、数値形式が使用されると、それが適切でない場合でも、それらをいずれか一方に強制します。またprintf、実際には BigInts をまったく処理しません (ただし、文字列として処理し、それを数値に変換して精度を落とします)。

%d の代わりに %s を適切な範囲内にあるかどうかわからない任意の数値で使用することは、負の数値について注意する場合を除いて、適切な回避策です。それらを処理するには、いくつかの Perl コードを作成する必要があります。

于 2009-05-06T08:48:22.203 に答える
1

フロートは、ある程度まで機能します。

perl -e "printf qq{%.0f\n}, 999999999999999"
999999999999999

しかし、ポイントまで

perl -e "printf qq{%.0f\n}, 9999999999999999999999999999999999999999999999"
9999999999999998663747590131240811450955988992

Bignum はここでは役に立ちません。

perl -e "use bignum ; printf qq{%.0f\n}, 9999999999999999999999999999999999999999999999"
9999999999999999931398190359470212947659194368    

問題はprintfです。(本当に printf が必要ですか?) 印刷できますか?

perl -e "use bignum;print 9999999999999999999999999999999999999999999999"
9999999999999999999999999999999999999999999999

そうは言っても、perl の良いところは、いつでも独自のオプションを作成できることです。

例えば

my $in = ...;
my $out = "";
while($in){
  my $chunk=$in & 0xf;
  $in >>= 4;
  $out = sprintf("%x",$chunk).$out;
}
print "0x$out\n";
于 2019-10-23T09:52:12.987 に答える
0

私は Perl の専門家ではありません。また、ここで bignum を自動的に処理する機能が欠落している可能性もありますが、これは単なる整数オーバーフローのケースではありませんか? 32 ビット整数は、99,999,999,999 までの数値を保持できません。

とにかく、私の 32 ビット Linux マシンで Perl v5.8.8 を使用しても同じ結果が得られます。「%d」を指定した printf は、より大きな数値を処理できないようです。

于 2009-05-06T07:51:15.460 に答える
0

Perl のコピーが壊れているに違いないと思います。これは CygWin のバージョン (5.10) のものです。

pax$ perl -e 'printf("%011d\n", 99999999999);'
99999999999

pax$ perl -v

This is perl, v5.10.0 built for cygwin-thread-multi-64int
(with 6 registered patches, see perl -V for more detail)

Copyright 1987-2007, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

実行しているバージョンは何ですか (の出力perl -v)?

Perl の 64 ビット対応バージョンを入手する必要があるかもしれません [そして、おそらく新しい 64 ビット プロダクション マシン] ("cygwin-thread-multi-64int"私の出力の に注意してください)。これにより、少なくともコードを変更する必要がなくなります。

私がこれを述べているのは、あなたがコードを大幅に変更したくない (つまり、何かを壊すことを恐れている) という根拠に基づいています。新しいハードウェアのソリューションは、少し高価ですが、ほとんどの場合、ソフトウェアをまったく変更する必要はありません。それはあなたの優先順位に依存します。

もう 1 つの可能性は、Perl 自体が数値を正しく保存しているのに、単に問題が原因で間違って表示している可能性があることprintf()です。その場合は、次のことを試してみてください。

$million = 1000000;
$bignum = 99999999999;
$firstbit = int($bignum / $million);
$secondbit = $bignum - $firstbit * million;
printf ("%d%06d\n",$firstbit,$secondbit);

それを関数に入れて、関数を呼び出して、次のような文字列を返します。

sub big_honkin_number($) {
    $million = 1_000_000;
    $bignum = shift;
    $firstbit = int($bignum / $million);
    $secondbit = $bignum - $firstbit * $million;
    return sprintf("%d%06d\n", $firstbit, $secondbit);
}
printf ("%s", big_honkin_number (99_999_999_999));

これは 64 ビット プラットフォームでテストしたことに注意してください。32 ビットで独自のテストを行う必要がありますが、任意の倍率を使用できます (必要に応じて 2 つ以上のセグメントを含む)。

更新:このトリックは 32 ビット Perl で問題なく機能するため、機能を詰め込んでいるようbig_honkin_number()に見えます。printf()

pax@pax-desktop:~$ perl -v

This is perl, v5.8.8 built for i486-linux-gnu-thread-multi

Copyright 1987-2006, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

pax@pax-desktop:~$ perl qq.pl
99999999999
于 2009-05-06T08:30:39.623 に答える