2012年2月3日金曜日

上限と下限の条件分岐

rootの計算はdoubleを使ってるので
ものすごい大きい数から
ものすごい小さい数まで計算できるので
いらないかもしれませんが
一応、考え方として
どれくらい大きい数から
どれくらい小さい数まで計算できるか
決めておいた方がいいですよね

とりあえず、最大1e+300
最小1e-300まで計算できるように決めました
決めるったら決めるw

でそんなのを求めるスクリプトです

追記:doubleの下限は300桁ちょいくらいなので
doubleの桁数も考え最小1e-285に変更しました
use strict;
use warnings;

printf &mul_10_X_count(0)."\n";
printf &mul_10_X_count(3)."\n";
printf &mul_10_300_count()."\n";
printf &mul_10_300_count()*&mul_0p1_X_count(300)."\n";
printf &mul_0p1_X_count(0)."\n";
printf &mul_0p1_X_count(3)."\n";
printf &mul_0p1_285_count()."\n";
printf &mul_0p1_285_count()*&mul_10_X_count(285)."\n";

# 10の引数A乗の数を返す
sub mul_10_X_count{
my $x=1.0;
my $i=$_[0];
$i--;
for(0..$i){
$x*=10;
}
return $x;
}
# 10の300乗の数を返す
sub mul_10_300_count{
return &mul_10_X_count(300);
}

# 0.1の引数A乗の数を返す
sub mul_0p1_X_count{
my $x=1.0;
my $i=$_[0];
$i--;
for(0..$i){
$x/=10;
}
return $x;
}
# 0.1の285乗の数を返す
sub mul_0p1_285_count{
return &mul_0p1_X_count(285);
}

0 件のコメント:

コメントを投稿