PHP-次方-溢出問題
我們都知道如果在php里面想計算2的n次方一般都會用采用系統(tǒng)內(nèi)置函數(shù)pow()
,或者手動寫一個for循環(huán)
去處理
echo pow(2,32); //4294967296
$a=2;
for ($i=1;$i<=31;$i++){
$a*=2;
}
echo $a; //4294967296
但是如果要求計算2的100次方或者3的100次方該怎么辦腋颠?如果還用上述方法的話肯定會溢出繁成,無法按正常位數(shù)顯示出來,如在32位機只能算到最大42億左右淑玫,但php這里如果溢出的話會用科學(xué)記數(shù)法表示.
echo pow(2,100); //1.2676506002282E+30
echo pow(3,100); //5.1537752073201E+47
$a=2;
for ($i=1;$i<=99;$i++){
$a*=2;
}
echo $a; //1.2676506002282E+30
解決方法:
1巾腕、 使用數(shù)學(xué)擴展庫 bcpow()
函數(shù),求高精確度數(shù)字次方值
echo bcpow(2,100); //1267650600228229401496703205376
echo bcpow(3,100); //515377520732011331036461129765621272702107522001
2絮蒿、用代碼實現(xiàn)乘法公式尊搬,就是把乘法筆算用程序去實現(xiàn),一位一位去乘土涝,如果有進位則往數(shù)組不斷的填充佛寿,這樣的話無論乘到多少位,數(shù)組都能容得下但壮,不會溢出.
//初始化數(shù)組里面只有一位就是2
//之后循環(huán)乘于2會不斷的進行進位往數(shù)組里面填充
//例: array(2)冀泻、array(4)、array(8)蜡饵、array(6,1)
$num = array(2);
$power = 2;
$bit = 1;
//循環(huán)次數(shù)99就相當(dāng)于100次方
//2*2 = 4
//4*2 = 8
//8*2 = 16
for($i=0;$i<99;$i++){
//按乘法公式計算,每一位乘于2
for($j=0; $j < $bit; $j++){
$n = $power * $num[$j] + $c;
if (strlen($n) == 2){ //等于2則代表有進位
$num[$j] = substr($n,1,1);
$c = substr($n,0,1); //進位
}else{
$num[$j] = $n;
$c = 0;
}
}
//如果最后一位算完,有進位
if ($c){
$num[$j] = $c; //保存進位
$c = 0;
$bit++; //當(dāng)前位數(shù)加一
}
}
echo strrev(join('',$num)); //1267650600228229401496703205376