3

1234567890.123456789 という大きな数値を計算したり、出力 (デバッグ) しようとすると、精度が失われます。

私の問題は、 $d (算術の結果) と $e の書式設定された出力にあると思います。ロングダブルを強制するにはどうすればよいですか? 私の Perl バージョン (SUN では 5.8.4) では、それが可能であると言われています。sprintf には long double (q または L または ll) のサイズ オプションがありますが、その使用方法がわかりません。また、printf で機能するかどうかもわかりません。

編集:動作するBigFloatを追加しました!しかし、私はまだロングダブルを強制したいと思っています。

1234567890 + 0.123456789 を加算し、1234567890 - 0.123456789 を減算してみてください。

use Config;
use Math::BigFloat;
$a = 1234567890;
$b = 123456789;
$c = $b/1e9;                   # 0.123456789
$d = $a + $c;                  # not enough precision (32-bit or double?)
$e = sprintf("%d.%.9d",$a,$b); # combine as strings
$f = 1234567890.123456789;     # for reference (not enough precision)

# Use BigFloat to bypass lack of longdbl
$aBig = Math::BigFloat->new("$a");
$dSum = $aBig->fadd("$c");         # $dSum = $a + $c
$aBig = Math::BigFloat->new("$a"); # <-- Need a new one for every operation?
$dDif = $aBig->fsub(abs("$c"));    # $dDif = $a - $c

print "a $a\n";             # 1234567890  
print "c $c\n";             # 0.123456789
print "d=a+c $d\n";         # 1234567890.12346  <-- **Problem**
print "dSum=a+c $dSum\n";   # 1234567890.123456789  <-- Solution
print "dDif=a-c $dDif\n";   # 1234567890.876543211  <-- Solution
print "e $e\n";             # 1234567890.123456789
print "f $f\n";             # 1234567890.12346  <-- double, 52-bit, not longdbl? 
printf ("printf    e 20.9f %20.9f\n",$e);    # 1234567890.123456717 <-- **Problem**
printf ("printf dSum 20.9f %20.9f\n",$dSum); # 1234567890.123456717 <-- **Problem**
printf ("printf dSum 20s %20s\n",$dSum);     # 1234567890.123456789 
printf ("printf dDif 20.9f %20.9f\n",$dDif); # 1234567890.876543283 <-- **Problem**
printf ("printf dDif 20s %20s\n",$dDif);     # 1234567890.876543211 

print "uselongdouble $Config{uselongdouble}\n"; # empty. No long doubles by default
print "d_longdbl $Config{d_longdbl}\n";         # "define". Supports long doubles
print "size double longdbl $Config{doublesize} $Config{longdblsize}\n"; # Ans 8 16

また、このコードを使用して型を理解しようとしましたが、あまり役に立ちませんでした。このような問題を説明するためにそれを使用した人はいますか?

use Devel::Peek 'Dump';

Dump ($dSum); # Wow, it's complicated
Dump ($f);
4

2 に答える 2