数值收敛和最小数量大小

con*_*con 0 floating-point precision perl

我有一个程序,其计算的概率值(p -值),但它正在进入一个非常大的负数到 exp函数 exp(-626294.830),其计算结果为零,而不是非常小的正数,它应该是.

我怎样才能将其评估为一个非常小的浮点数?我曾尝试 Math::BigFloat, bignumbigrat ,但都失败了.

hau*_*kex 6

Wolfram Alpha说这exp(-626294.830)是4.08589×10 ^ -271997 ...零是非常近似的;-)虽然你已经编辑并从你的问题中删除了上下文,你真的需要使用这么小的数字,或者也许有某种方式,你可以优化你的算法或扩大你的数字?

无论如何,你是正确的,代码Math::BigFloat->new("-626294.830")->bexp似乎需要相当长的一段时间,即使有支持use Math::BigFloat lib => 'GMP';.

我当时可以提供唯一的选择是Math::Prime::Util::GMPexpreal,但你需要指定一个精确到它.

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秒才能运行,这让我们回到了其他地方潜在优化的问题.