我试着这样做:
$total = 0;
for ($j = 0; $j < 1000; $j++) {
$x = $j / 1000;
$total += pow($x, 1500) * pow((1 - $x), 500);
}
$ total 为0。
PHP无法使用太小的浮点值。我能做什么?我可以使用哪些库?
答案 0 :(得分:1)
功能
f(x) = x^1500 * (1-x)^500
具有(对数)导数
f'(x)/f(x)=d/dx log(f(x))
= 1500/x - 500/(1-x)
为零
x0 = 3/4
最大值为
f(3/4) = 3^1500/2^4000 = exp(-1124.6702892376163)
= 10^(-488.4381005764309)
= 3.646694848749686e-489
使用它作为参考值,现在可以总结
f(i/1000)/f(3/4)=exp(1500*log(i/1000)+500*log(1-i/1000)+1124.6702892376163)
给出24.26257515625789
的总和,以便得到所需的结果
24.26257515625789*f(3/4)=8.847820783972776e-488
计算这样一个总和的一种实用方法是计算对数列表(比PHP更python,查找相应的数组操作)
logf = [ log(f(i/1000.0)) for i=1..999 ]
使用f
,log(f(x))=1500*log(x)+500*log(1-x)
的转换对数。
然后计算maxlogf = max(logf)
,提取十进制幂的数量N=floor(maxlogf/log(10))
并将总和计算为
sumfred = sum([ exp( logfx - N*log(10) ) for logfx in logf ])
以便最终结果为sumfred*10^N
。