如何将浮点数提高到大整数?

时间:2017-03-01 11:35:33

标签: php math

我试着这样做:

$total = 0;
for ($j = 0; $j < 1000; $j++) {
    $x = $j / 1000;
    $total += pow($x, 1500) * pow((1 - $x), 500);
}

$ total 为0。

PHP无法使用太小的浮点值。我能做什么?我可以使用哪些库?

1 个答案:

答案 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 ]

使用flog(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