下記のソースは、8進数18桁の777777777777777777を10進数に変換する処理です。
算出する答えは、18014398509481984(1.8014398509482E+16)です。念のためこちらのサイトで答え合わせをしたところ、
10進数 18014398509481984
(詳細な計算は、18014398509481983)
とありました。下一桁目が4で、詳細な計算をすると3になっています。この詳細な計算によって得られる数値は、どうすれば算出できるのだろうと思い諸々と調べてみるとまだそれが正解なのかは、わかりませんが、
BCMATH関数を使えば(変換する数値が18桁なので32bit環境だとdoubleになってしまったのか、
15桁以上だと指数表記になってしまいそれが何か影響を与えているのか分かりませんが、
それなら大きい桁数を扱えるBC関数を、と思いました。)どうにかなるのかもと思い計算処理にBCMATH関数を使いました。
しかし、最後の加算処理部分で躓いてしまいました。思いつく限りのことを書いては消し書いては消しを続けてついに思いつかなくなったので質問に至りました。
for文ではなくarray_sumとBCMATH関数の併用でどうにかならないかなとも思ったのですが、なぜか算出される値が0となってしまいます。
php
1 2 var_dump((int)("777777777777777777")); 3 $nsinsu = 8; 4 $henkan_suuzi = "777777777777777777";//8進数18桁 5 $result = preg_split("//", $henkan_suuzi,-1,PREG_SPLIT_NO_EMPTY); 6 print var_dump($result); 7 $kazu = count($result); 8 print "<p>●配列の数:".$kazu."</p>"; 9 10 //for文内の初期化式であるpow()は、第一引数が、基数(つまり$nsinsu)、第二引数が指数。一文字ずつに分割されたn進数の数字が代入された$resultに対してかけるべき指数を算出。 11 for($i=0,$bekizyo = bcpow($nsinsu,$kazu-1);$kazu > $i;$i++){ 12 if($i !== 0) { 13 $bekizyo = bcdiv($bekizyo,$nsinsu); 14 } 15 print "計算式:".$bekizyo."*".$result[$i]."<hr>"; 16 $zyusinsu[] = bcmul($bekizyo,$result[$i]); 17 } 18 print var_dump($zyusinsu); 19 20 //上手く算出されないのでコメントアウト 21 //$aaa = array_sum($zyusinsu); 22 //$zero = "0"; 23 //bcaddで計算 24 //$bbb= bcmul($aaa,$zero);//なぜか0になる 25 //print "<hr>答え".$bbb."<hr>"; 26 27 //※加算処理でなんとかBCMATH関数を使いたい。 28 //配列の数値を加算。 29 //zyusinsu[0]+zyusinsu[1]+zyusinsu[2]+zyusinsu[3]+zyusinsu[4]... 30 //配列の数だけ、zyusinsu[0]に1番目以降の配列の値を加算させる。 31 for($i=1;$i<count($zyusinsu);$i++) { 32 $zyusinsu[0] += $zyusinsu[$i]; 33 } 34 //print $zyusinsu[0]; 35 36 if(preg_match("/E/",$zyusinsu[0])===1) { 37 $zyusinsu[0] = sprintf("%.0f",$zyusinsu[0]); 38 } 39 print "<hr>".$zyusinsu[0];
いったいどうすると加算処理部分にBCMATH関数が使えるようになり、詳細な計算で下一桁目が3になるのでしょうか。
回答2件
あなたの回答
tips
プレビュー