By way of illustration, let's take my BC program base.
The BCMATH conversion of base consists of four files: base.html, base.php, check_input.php and base_.php:
<FORM ACTION="base.php" METHOD="POST">
Enter b (> 1):<INPUT TYPE=TEXT NAME="Bvalue" SIZE=10><br>
Enter a non-negative integer n:<INPUT TYPE=TEXT NAME="Nvalue" SIZE=50><br>
<INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="GO">
<INPUT TYPE=RESET NAME="RESET" VALUE="RESET">
</FORM>
<html>
<?php
#PHP file base.php
include("base_.php");
include("check_input.php");
$Bvalue=trim($Bvalue);
$Nvalue=trim($Nvalue);
$check1=check_decimal($Bvalue);
$check2=check_decimal($Nvalue);
if ($check1==0 || $check2==0){
print "<p>\n";
}
else if(bccomp($Bvalue,"1")<=0){
print "b <= 1<br>\n";
}
else if(bccomp($Nvalue,"0")<0){
print "n < 0<br>\n";
}
else {
base($Bvalue,$Nvalue);
for($j=$length;bccomp($j,"1")>=0;$j=bcsub($j,"1")){
if(bccomp($j,"1")>0){
print "$digits[$j]b<sup>$j</sup> + ";
}else{
print "$digits[$j]b +";
}
flush();
}
print "$digits[0]<br>\n";
flush();
print "is the base b=$Bvalue expansion of $Nvalue<br>\n";
flush();
}
print "<p>\n";
print "<a href=\"./base.html\">Return to main page</a><br>\n";
?>
</html>
<?php
#PHP file base_.php
function base($b,$n){
global $length;
global $digits;
$i=0;
$x=$n;
while(bccomp($n,$b)>=0){
$q=bcdiv($n,$b);
$temp=bcmul($q,$b);
$t=bcsub($n,$temp);
$digits[$i]=$t;
$n=$q;
$i=bcadd($i,"1");
}
$digits[$i]=$n;
$length=$i;
return;
}
?>
Notice the declaration of global variable length and global array digits at the top of the file. These variables will be accessible in base.php.if($a<$b),if($a==$b), if($a>$b), if($a!=$b)
one should useif(bccomp($a,$b)<0), if(bccomp($a,$b)==0), if(bccomp($a,$b)>0), if(bccomp($a,$b))
to be on the safe side.<?php $large_number1 = 2147483648; $large_number2 = 2147483647; $large_number3 = -2147483647; $large_number4 = -2147483648; var_dump($large_number1); echo "<br>\n"; var_dump($large_number2); echo "<br>\n"; var_dump($large_number3); echo "<br>\n"; var_dump($large_number4); echo "<br>\n"; ?>The output is
float(2147483648) int(2147483647) int(-2147483647) float(-2147483648)Example 2.
<?php
$test1="10000000000000000";
$test2="10000000000000001";
if($test1>$test2){
echo "10000000000000000 > 10000000000000001<br>\n";
}elseif($test1==$test2){
echo "10000000000000000 = 10000000000000001<br>\n";
}else{
echo "10000000000000000 < 10000000000000001<br>\n";
}
$t=bccomp($test1,$test2);
if($t==1){
echo "10000000000000000 > 10000000000000001<br>\n";
}elseif($t==0){
echo "10000000000000000 = 10000000000000001<br>\n";
}else{
echo "10000000000000000 < 10000000000000001<br>\n";
}
$t=strcmp($test1,$test2);
if($t==1){
echo "10000000000000000 > 10000000000000001<br>\n";
}elseif($t==0){
echo "10000000000000000 = 10000000000000001<br>\n";
}else{
echo "10000000000000000 < 10000000000000001<br>\n";
}
?>
The output is
10000000000000000 = 10000000000000001 10000000000000000 < 10000000000000001 10000000000000000 < 10000000000000001
$a="123456789123456";
instead of$a=123456789123456;
There seems to be no problem if $a has less than 15 digits.for($i="0";bccomp($i,$n)<0;$i++).
Instead this should be written asfor($i="0";bccomp($i,$n)<0;$i=bcadd($i,"1")).
Similarly, one cannot use i++ inside while.
<html>
#PHP file lcm.php
<?php
include("lcm_.php");
$Mvalue=trim($Mvalue);
include("check_input.php");
$a=split('[ ]+',$Mvalue);
$t=count($a);
if(bccomp($t,"1")<=0){
print "number of entries is less than or equal to 1<br>\n";
flush();
}
else{
$flag="0";
for($i="0";bccomp($i,$t)<0;i=bcadd($i,"1")){
$check=check_decimal($a[$i]);
if ($check==0){
print "<p>\n";
flush();
$flag="1";
break;
}
$u=bccomp($a[$i],"0");
if($u<=0){
print "a[$i] <= 0<br>\n";
flush();
$flag="1";
break;
}
}
if($flag==0){
$lcm=lcma($a,$t);
print "lcm(";
$j=bcsub($t,"1");
for($i="0";bccomp($i,$j)<0;$i=bcadd($i,"1")){
print "$a[$i], ";
}
print "$a[$i]) = $lcm";
}
}
print "<p>\n";
flush();
print "<a href=\"./lcm.html\">Return to main page</a><br>\n";
flush();
?>
print "matrix[$i][$j]=$matrix[$i][$j] "; /* does not work */
$t=$matrix[$i][$j];
print "matrix[$i][$j]=$t "; /* works */
Please email any comments or suggestions to Keith Matthews
Last modified 21st July 2006
Return to main page