con*_*con 0 floating-point precision perl
我有一个程序,其计算的概率值(p -值),但它正在进入一个非常大的负数到
exp函数
exp(-626294.830),其计算结果为零,而不是非常小的正数,它应该是.
我怎样才能将其评估为一个非常小的浮点数?我曾尝试
Math::BigFloat,
bignum和
bigrat
,但都失败了.
Wolfram Alpha说这exp(-626294.830)是4.08589×10 ^ -271997 ...零是非常近似的;-)虽然你已经编辑并从你的问题中删除了上下文,你真的需要使用这么小的数字,或者也许有某种方式,你可以优化你的算法或扩大你的数字?
无论如何,你是正确的,代码Math::BigFloat->new("-626294.830")->bexp似乎需要相当长的一段时间,即使有支持use Math::BigFloat lib => 'GMP';.
我当时可以提供唯一的选择是Math::Prime::Util::GMP的expreal,但你需要指定一个精确到它.
use Math::Prime::Util::GMP qw/expreal/;
use Math::BigFloat;
my $e = Math::BigFloat->new(expreal(-626294.830,272000));
print $e->bnstr,"\n";
__END__
4.086e-271997
Run Code Online (Sandbox Code Playgroud)
但是在我的机器上,即使这仍需要大约20秒才能运行,这让我们回到了其他地方潜在优化的问题.
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |