美文网首页技术文PHP学习PHP实战
PHP-2的N次方-溢出问题

PHP-2的N次方-溢出问题

作者: 简单方式 | 来源:发表于2017-03-01 14:44 被阅读349次
    PHP-次方-溢出问题
    我们都知道如果在php里面想计算2的n次方一般都会用采用系统内置函数pow(),或者手动写一个for循环去处理
      echo pow(2,32); //4294967296
    
      $a=2;
      for ($i=1;$i<=31;$i++){
         $a*=2;
      }
      echo $a; //4294967296
    

    但是如果要求计算2的100次方或者3的100次方该怎么办?如果还用上述方法的话肯定会溢出,无法按正常位数显示出来,如在32位机只能算到最大42亿左右,但php这里如果溢出的话会用科学记数法表示.

     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、 使用数学扩展库 bcpow() 函数,求高精确度数字次方值

     echo bcpow(2,100); //1267650600228229401496703205376
     echo bcpow(3,100); //515377520732011331036461129765621272702107522001
    

    2、用代码实现乘法公式,就是把乘法笔算用程序去实现,一位一位去乘,如果有进位则往数组不断的填充,这样的话无论乘到多少位,数组都能容得下,不会溢出.

    //初始化数组里面只有一位就是2
    //之后循环乘于2会不断的进行进位往数组里面填充
    //例: array(2)、array(4)、array(8)、array(6,1)
    $num = array(2); 
    $power = 2;      
    $bit = 1;        
    
    //循环次数99就相当于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++; //当前位数加一
           }
    }
    
    
    echo strrev(join('',$num)); //1267650600228229401496703205376
    

    相关文章

      网友评论

        本文标题:PHP-2的N次方-溢出问题

        本文链接:https://www.haomeiwen.com/subject/tiiqgttx.html