최근에 PHP 8 릴리즈가 발표되었다.

변한 것은 여러가지 있지만, 사소한 변화 한 가지만 소개한다.

PHP 8에서는 부동소수점수 나눗셈 함수 fdiv($a, $b) 가 추가되었다.

기존의 나눗셈 $a / $b 는 나누는 수 $b 가 0일 경우 에외가 발생하지만,

IEEE 754 의 권고에 따라 0으로 나누는 경우 나누어지는 수가

양수냐 움수냐 0이냐에 따라 나눈 결과가 각각 +INF, -INF, NAN 로 된다.

PHP 7,xx 까지에는 fmod($a, $b) 함수와 intdiv($a, $b) 함수가 이미 있었는데.

여기에 보조를 맞추어 fdiv($a, $b) 가 PHP 8에 새롭게 추가되었다고 한다.

intdiv() 와 대비되는 이름 floatdiv() 으=로 할까도 고려해보았지만,

fmod() 와 대비되는 이름 fdiv() 로 정했다고 한다.

다음은 인터프리터 명령 php -a 로 실행한 예이다.

Interactive shell

php > $a = 45.3;
php > $b = 11.2;
php > $c = fdiv($a, $b);
php > echo $c;
4.0446428571429
php > echo ($a . $b);
45.311.2
php > echo ($a / $b);
4.0446428571429
php > fdiv(11, 3);
php > echo fdiv(11, 3);
3.6666666666667
php > echo 11 / 3;
3.6666666666667
php > 11 / 0;

Warning: Uncaught DivisionByZeroError: Division by zero in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1
php > echo fdiv(11, 0);
INF
php > echo fdiv(-11, 0);
-INF
php > echo fdiv(-0, 0);
NAN
php > echo fdiv(0, 0);
NAN
php > echo fmod(-11, 0);
NAN
php > echo intdiv(-11, 3);
-3
php > echo -11/ 3;
-3.6666666666667
php > echo fmod(-11, 3);
-2
php > echo fdiv(-11 - fmod(-11, 3), 3);
-3
php > echo fdiv(22 - fmod(22, 3), 3);
7
php > echo fdiv(10, 0);
INF
php > echo fdiv(-1.2, 0);
-INF
php > echo fdiv(-0, 0);
NAN
php > echo (fdiv(12 - 5, 1 - 1) == INF);
1
php > echo (fdiv(-12 + 5, 1 - 1) == INF);
php > echo (fdiv(-12 + 5, 1 - 1) == INF);
php > echo (fdiv(-12 + 5, 1 - 1) == -INF);
1
php > echo (fdiv(-5 + 5, 1 - 1) == -INF);
php > echo (fdiv(-5 + 5, 1 - 1) == INF);
php > echo (fdiv(-5 + 5, 1 - 1) == NAN);
php > echo (fdiv(0, 0) == NAN);
php > echo (is_nan(fdiv(0, 0)));
1
php > echo (is_nan(fdiv(1, 0)));
php > echo (is_infinite(fdiv(1, 0)));
1
php > echo (is_finite(fdiv(1, 0)));
php > echo (is_finite(fdiv(1, 2)));
1
php > echo (is_infinite(fdiv(-1, 0)));
1
php > echo (is_finite(fdiv(-1, 0)));

   

관련 자료:

[1] PHP 홈페이지

[2] PHP8 다운로드

[3] PHP7과 PHP8의 간단 비교

[4] PHP8의 새 기능 몇 가지

 

 

 

 

Posted by Scripter
,

 

PHP 언어 소스:

<?php

// Filename: testHexView_02.php
//
//  Purpose:  Show Hexadecimal codes of the given binary file.
//
// Execute: php testHexView_02.php [filename]
//
// Date: 2013. 8. 5.

 

function toHex($c) {
    $s = "";
    $x1 = ($c & 0xF0) >> 4;
    $x2 = $c & 0x0F;
    if ($x1 < 10) {
        $s = $s . chr($x1 + ord('0'));
    } else {
        $s = $s . chr(($x1 - 10) + ord('A'));
    }
    if ($x2 < 10) {
        $s = $s . chr($x2 + ord('0'));
    } else {
        $s = $s . chr(($x2 - 10) + ord('A'));
    }
    return $s;
}

function toHex8($n) {
    $s = "";
    $x1 = ($n & 0xF0000000) >> 28;
    $x2 = ($n & 0xF000000) >> 24;
    $x3 = ($n & 0xF00000) >> 20;
    $x4 = ($n & 0xF0000) >> 16;
    $x5 = ($n & 0xF000) >> 12;
    $x6 = ($n & 0xF00) >> 8;
    $x7 = ($n & 0xF0) >> 4;
    $x8 = $n & 0x0F;
    if ($x1 < 10) {
        $s = $s . chr($x1 + ord('0'));
    } else {
        $s = $s . chr(($x1 - 10) + ord('A'));
    }
    if ($x2 < 10) {
        $s = $s . chr($x2 + ord('0'));
    } else {
        $s = $s . chr(($x2 - 10) + ord('A'));
    }
    if ($x3 < 10) {
        $s = $s . chr($x3 + ord('0'));
    } else {
        $s = $s . chr(($x3 - 10) + ord('A'));
    }
    if ($x4 < 10) {
        $s = $s . chr($x4 + ord('0'));
    } else {
        $s = $s . chr(($x4 - 10) + ord('A'));
    }
    $s = $s . " ";
    if ($x5 < 10) {
        $s = $s . chr($x5 + ord('0'));
    } else {
        $s = $s . chr(($x5 - 10) + ord('A'));
    }
    if ($x6 < 10) {
        $s = $s . chr($x6 + ord('0'));
    } else {
        $s = $s . chr(($x6 - 10) + ord('A'));
    }
    if ($x7 < 10) {
        $s = $s . chr($x7 + ord('0'));
    } else {
        $s = $s . chr(($x7 - 10) + ord('A'));
    }
    if ($x8 < 10) {
        $s = $s . chr($x8 + ord('0'));
    } else {
        $s = $s . chr(($x8 - 10) + ord('A'));
    }
    return $s;
}


// Begin from here

if ($argc < 2) {
    printf("Usage: php testHexView_02.php [filename]\n");
    exit( 1 );
}

$fname = $argv[1];

if (! file_exists($fname)) {
    printf("The file \"%s\" does not exist.\n", $fname);
    exit( 1 );
}

if (is_dir($fname)) {
    printf("The path \"%s\" is a directory.\n", $fname);
    exit( 1 );
}

if (! is_readable($fname)) {
    printf("The file \"%s\" can not be read.\n", $fname);
    exit( 1 );
}

$handle = fopen($fname, "rb");
$fsize = filesize($fname);
$contents = fread($handle, $fsize);
fclose($handle);


printf("The size of the file \"%s\" is %d.\n", $fname, $fsize);
printf("\n");


$n = 0;
$t = "";

for($i = 0; $i < $fsize; $i++) {
    if ($n % 16 == 0) {
        printf("%s: ", toHex8($n));
    }
   
   $c = $contents[$i];
   $base10value = ord($c);


   printf(" %s", toHex($base10value));
   if ($base10value < ord(' ') or $base10value > 0x7F) {
       $t = $t . '.';
   } else {
       $t = $t . $c;
   }
   $n++;
    if ($n % 16 == 0) {
        printf("  |%s|\n", $t);
        $t = "";
    }
}

if ($t != "") {
    for($i = 0; $i < 16 - ($n % 16); $i++) {
        printf("   ");
    }
    printf("  |%s", $t);
    $t = "";
    for($i = 0; $i < 16 - ($n % 16); $i++) {
        printf(" ");
    }
    printf("|\n", $t);
}


printf("\nRead %d bytes.\n", $fsize);

?>

 

 

실행 예 1> php testHexView_02.php temp_1.bin
The size of the file "temp_1.bin" is 12.

0000 0000:  48 65 6C 6C 6F 20 74 68 65 72 65 0A              |Hello there.    |

Read 12 bytes.

 

실행 예 2> php testHexView_02.php myFile.ser
The size of the file "myFile.ser" is 130.

0000 0000:  AC ED 00 05 73 72 00 06 50 65 72 73 6F 6E 07 31  |....sr..Person.1|
0000 0010:  46 DB A5 1D 44 AB 02 00 03 49 00 03 61 67 65 4C  |F...D....I..ageL|
0000 0020:  00 09 66 69 72 73 74 4E 61 6D 65 74 00 12 4C 6A  |..firstNamet..Lj|
0000 0030:  61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B  |ava/lang/String;|
0000 0040:  4C 00 08 6C 61 73 74 4E 61 6D 65 71 00 7E 00 01  |L..lastNameq.~..|
0000 0050:  78 70 00 00 00 13 74 00 05 4A 61 6D 65 73 74 00  |xp....t..Jamest.|
0000 0060:  04 52 79 61 6E 73 71 00 7E 00 00 00 00 00 1E 74  |.Ryansq.~......t|
0000 0070:  00 07 4F 62 69 2D 77 61 6E 74 00 06 4B 65 6E 6F  |..Obi-want..Keno|
0000 0080:  62 69                                            |bi              |

Read 130 bytes.

 

 

Posted by Scripter
,

음이 아닌 실수 A 의 평방근 sqrt(A) 를 구하는 Heron 의 방법:

        반복함수  g(x) = (x + A/x) / 2   를 이용

 

실수 A 의 n제곱근 root(n, A) 를 구하는 Newton-Raphson 의 방법

        반복함수  g(x) = ((n-1)*x + A/(x**(n - 1))) / n    를 이용

n = 2 인 경우에는 Newton-Raphson 의 방법이 Heron 의 방법과 동일하다.

(참조. http://en.wikipedia.org/wiki/Newton's_method )

 

PHP 언어에는 지수 연산을 하는 pow(밑수, 지수) 함수가 이미 구현되어 있다. 하지만 차후 필요한 데가 있을 것 같아서 이와 유사한 n 제곱 함수와 n 제곱근 함수를 구현해 보았다.

지수가 정수인 거듭제곱을 계산하는  함수도 nPow(), gPow, mPow() 세 개 구현해 놓았는데, 이들 세 함수는 절차적 언어의 성능상 재귀호출이 아니고 단순 반복 기법을 사용하는 함수이다. 이 세 함수 중 mPow() 의 성능이 가장 우수하다. 큰 지수의 경우 for 반복문의 반복회수를 따져 보면 성능 비교를 할 수 있을 것이다. (성능 비교를 위해 세 가지를 모두 소스에 남겨 두었다.) mPow() 함수는 n 제곱근을 구하는 재귀함수 newtonNthRoot(int, double) 의 구현에 사용되기도 한다. if ... else ... 구문이 많아 소스가 복잡하게 보일지 모르겠으나 이는 밑수나 지수가 음수이거나 0인 경우의 처리를 위함이다. 구현된 모든 함수의 구현에는 예외상황(예를 들어, 음수의 짝수 제곱근 같은 예외상황) 처리 과정이 있다.

아래의 소스는 대부분 버전의 Lua 에서 실행되도록 작성된 소스이다.

예외상황 처리에 대해서는 (Java 언어에서 처럼) throw ... 구문으로 예외상황 던지기를 하고, try ... catch ... 구문으로 예와상황 받기를 한다.

<?php

// Filename: testNthRoot.php
//
//            Approximate square roots, cubic roots and n-th roots of a given number.
//
// Execute: php testNthRoot.php
//
// Date: 2013. 1. 9.
// Copyright (c) 2013 PH Kim  (pkim __AT__ scripts.pe.kr)

 

$NO_EXCEPTION         =  (0);
$CANNOT_EVALUATE   =  (100);

$MAX_ITER = 20000;
$M_EPSILON = 1.0e-15;

 


/**
  * Compute the n-th root of x to a given scale, x > 0.
  */
function nPow($a, $n) {
    if ($n > 0) {
        if ($n == 1)
            return $a;
        else {
            if ($a == 0.0 || $a == 1.0) {
                return $a;
            }
            else if ($a == -1.0) {
                if ($n % 2 == 1)
                    return -1.0;
                else
                    return 1.0;
            }
            else if ($a < 0.0) {
                if ($n % 2 == 1) {
                    return -nPow(-$a, $n);
                }
                else {
                    return nPow(-$a, $n);
                }
            }
            else {
                $y = 1.0;
                for ($i = 0; $i < $n; $i++) {
                    $y *= $a;
                }
                return $y;
            }
        }
    }
    else if ($n == 0) {
        return 1.0;
    }
    else {      //  when n < 0
        if ($a == 0.0) {
            throw new Exception("Negative powering exception of zero.");
        }
        else {
            if ($n == -1)
                return 1.0/$a;
            else
                return 1.0/nPow($a, -$n);
        }
    }
}

 

/**
  * Compute the n-th root of x to a given scale, x > 0.
  */
function gPow($a, $n) {
    if ($n > 0) {
        if ($n == 1)
            return $a;
        else {
            if ($a == 0.0 || $a == 1.0) {
                return $a;
            }
            else if ($a == -1.0) {
                if ($n % 2 == 1)
                    return -1.0;
                else
                    return 1.0;
            }
            else if ($a < 0.0) {
                if ($n % 2 == 1)
                    return -gPow(-$a, $n);
                else
                    return gPow(-$a, n);
            }
            else {

                $y = 1.0;
                $r = $a;
                $m = 8*4 - 1;            // 8*sizeof(int) - 1;  ignore sign bit, which is MSB
                $one = 1;
                for ($i = 0; $i < $m; $i++) {
                    if (($n & $one) == 0) {
                        $y *= 1.0;
                    }
                    else {
                        $y *= $r;
                    }
                    $r = $r*$r;
                    $one <<= 1;
                    if ($one > $n)
                        break;
                }
                return $y;
            }
        }
    }
    else if ($n == 0) {
        return 1.0;
    }
    else {      //  when n < 0
        if ($a == 0.0) {
            throw new Exception("Negative powering exception of zero.");
        }
        else {
            if ($n == -1)
                return 1.0/$a;
            else
                return 1.0/gPow($a, -$n);
        }
    }
}

 

/**
  * Compute the n-th root of x to a given scale, x > 0.
  */
function mPow($a, $n) {
    if ($n > 0) {
        if ($n == 1)
            return $a;
        else {
            if ($a == 0.0 || $a == 1.0) {
                return $a;
            }
            else if ($a == -1.0) {
                if ($n % 2 == 1)
                    return -1.0;
                else
                    return 1.0;
            }
            else if ($a < 0.0) {
                if ($n % 2 == 1)
                    return -mPow(-$a, $n);
                else
                    return mPow(-$a, $n);
            }
            else {

                $y = 1.0;
                $r = $a;
                $m = $n;
                while ($m > 0) {
                    if (($m & 0x1) != 0) {
                        $y *= $r;
                    }
                    $r = $r*$r;
                    $m >>= 1;
                }
                return $y;
            }
        }
    }
    else if ($n == 0) {
        return 1.0;
    }
    else {      //  when n < 0
        if ($a == 0.0) {
            throw new Exception("Negative powering exception of zero.");
        }
        else {
            if ($n == -1)
                return 1.0/$a;
            else
                return 1.0/mPow($a, -$n);
        }
    }
}

 

/**
  * Compute the square root of x to a given scale, x > 0.
  */
function heronSqrt($a) {
    global $MAX_ITER, $M_EPSILON;

    if ($a < 0.0) {
        throw new Exception("Cannot find the sqrt of a negative number.");
    }
    else if ($a == 0.0 || $a == 1.0) {
        return $a;
    }
    else {
        $x1 = $a;
        $x2 = ($x1 + $a/$x1)/2.0;
        $er = $x1 - $x2;
        $counter = 0;
        while ($x1 + $er != $x1) {
            $x1 = $x2;
            $x2 = ($x1 + $a/$x1)/2.0;
            $er = $x1 - $x2;
            if (abs($er) < abs($M_EPSILON*$x1))
                break;
            $counter++;
            if ($counter > $MAX_ITER)
                break;
        }
        if ($counter >= $MAX_ITER) {
            throw new Exception("Inaccurate sqrt exception by too many iterations.");
        }
        return $x2;
    }
}

/**
  * Compute the cubic root of x to a given scale, x > 0.
  */
function newtonCbrt($a) {
    global $MAX_ITER, $M_EPSILON;

    if ($a == 0.0 || $a == 1.0 || $a == -1.0) {
        return $a;
    }
    else if ($a < 0.0) {
        return -newtonCbrt(-$a);
    }
    else {
        $x1 = $a;
        $x2 = (2.0*$x1 + $a/($x1*$x1))/3.0;
        $er = $x1 - $x2;
        $counter = 0;
        while ($x1 + $er != $x1) {
            $x1 = $x2;
            $x2 = (2.0*$x1 + $a/($x1*$x1))/3.0;
            $er = $x1 - $x2;
            if (abs($er) < abs($M_EPSILON*$x1))
                break;
            $counter++;
            if ($counter > $MAX_ITER)
                break;
        }
        if ($counter >= $MAX_ITER) {
            throw new Exception("Inaccurate cbrt exception by too many iterations.");
        }
        return $x2;
    }
}


/**
  * Compute the n-th root of x to a given scale, x > 0.
  */
function newtonNthRoot($n, $a) {
    global $MAX_ITER, $M_EPSILON;

    if ($n == 0) {
        return 1.0;
    }
    else if ($n == 1) {
        return $a;
    }
    else if ($n > 0) {
        if ($a == 0.0 || $a == 1.0) {
            return $a;
        }
        else if ($a == -1.0) {
            if ($n % 2 == 1)
                return $a;
            else {
                throw new Exception("Cannot find the even n-th root of a negative number.");
            }
        }
        else if ($a < 0.0) {
            if ($n % 2 == 1)
                return -newtonNthRoot($n, -$a);
            else {
                throw new Exception("Cannot find the even n-th root of a negative number.");
            }
        }
        else if ($a < 1.0) {
            return 1.0/newtonNthRoot($n, 1.0/$a);
        }
        else {
            $x1 = $a;
            $xn = mPow($x1, $n - 1);
            $x2 = (($n - 1)*$x1 + $a/$xn)/$n;
            $er = $x1 - $x2;
            $counter = 0;
            while ($x1 + $er != $x1) {
                $x1 = $x2;
                $xn = mPow($x1, $n - 1);
                $x2 = (($n - 1)*$x1 + $a/$xn)/$n;
                $er = $x1 - $x2;
                if (abs($er) < abs($M_EPSILON*$x1))
                    break;
                $counter++;
                if ($counter > $MAX_ITER)
                    break;
            }
            if ($counter >= $MAX_ITER) {
                throw new Exception("Inaccurate n-th exception by too many iterations.");
            }
            return $x2;
        }
    }
    else {
        if ($a == 0.0) {
            throw new Exception("Cannot find the negative n-th root of zero.");
        }
        else {
            return 1.0/newtonNthRoot(-$n, $a);
        }
    }
}

 

echo("[ Testing heronSqrt(double) ]--------------------\n");
$x = 16.0;
$u = sqrt($x);
echo("x = $x\n");
echo("u = sqrt($x) = $u\n");
$y = heronSqrt($x);
echo("y = heronSqrt($x) = $y\n");
printf("y*y = %g\n", $y*$y);
echo("\n");

printf("[ Testing newtonCbrt(double) ]--------------------\n");
$x = -216.0;
printf("x = %g\n", $x);
printf("-exp(log(-x)/3.0) = %g\n", -exp(log(-$x)/3.0));
$w = newtonCbrt($x);
printf("w = newtonCbrt(%g) = %g\n", $x, $w);
printf("w*w*w = %g\n", $w*$w*$w);
printf("\n");

$x = 729000000000.0;
printf("x = %g\n", $x);
printf("exp(log(x)/3.0) = %g\n", exp(log($x)/3.0));
$w = newtonCbrt($x);
printf("w = newtonCbrt(%g) = %g\n", $x, $w);
printf("w*w*w = %g\n", $w*$w*$w);
printf("\n");

printf("[ Testing newtonNthRoot(int, double) ]--------------------\n");
$z = newtonNthRoot(3, $x);
printf("x = %g\n", $x);
printf("z = newtonNthRoot(3, %g) = %g\n", $x, $z);
printf("z*z*z = %g\n", $z*$z*$z);
printf("\n");

$x = 12960000000000000000.0;
$z = newtonNthRoot(4, $x);
printf("x = %g\n", $x);
printf("z = newtonNthRoot(4, x) = newtonNthRoot(4, %g) = %g\n", $x, $z);
printf("z*z*z*z = %g\n", $z*$z*$z*$z);
printf("\n");

$x = 1.0/12960000000000000000.0;
$z = newtonNthRoot(4, $x);
printf("x = %g\n", $x);
printf("exp(log(x)/4.0) = %g\n", exp(log($x)/4.0));
printf("z = newtonNthRoot(4, x) = newtonNthRoot(4, %g) = %g\n", $x, $z);
printf("z*z*z*z = %g\n", $z*$z*$z*$z);
printf("\n");


try {
    $x = -4.0;
    printf("[ Test Exception heronSqrt(double) ]--------------------\n");
    printf("x = %g\n", $x);
    printf("Calculating heronSqrt(%g)\n" , $x);
    $y = heronSqrt($x);
    printf("y = heronSqrt(%g) = %g\n", $x, $y);
    printf("y*y = %g\n", $y*$y);
    printf("\n");
}
catch (Exception $err) {
    printf("%s\nCaught some exception in calculating heronSqrt(%g)\n", $err->getMessage(), $x);
    printf("\n");
}


try {
    $x = -4.0;
    printf("[ Test Exception in newtonCbrt(double) ]--------------------\n");
    printf("x = %g\n", $x);
    printf("Calculating newtonCbrt(%g)\n", $x);
    $y = newtonCbrt($x);
    printf("y = newtonCbrt(%g) = %g\n", $x, $y);
    printf("y*y*y = %g\n", $y*$y*$y);
    printf("\n");
}
catch (Exception $err) {
    printf("%s\nCaught some exception in calculating newtonCbrt(%g)\n", $err->getMessage(), $x);
    printf("\n");
}


printf("[ Test calculations by powering ]-----------------------------\n");
$x = 200.0;
$z = newtonNthRoot(10, $x);
printf("x = %g\n", $x);
printf("exp(log(x)/10.0) = %g\n", exp(log($x)/10.0));
printf("z = newtonNthRoot(10, x) = newtonNthRoot(10, %g) = %g\n", $x,  $z);
printf("pow(z, 10) = %g\n", pow($z, 10));
printf("\n");

$x = 3001.0;
$z = newtonNthRoot(99, $x);
printf("x = %g\n", $x);
printf("exp(log(x)/99.0) = %g\n", exp(log($x)/99.0));
printf("z = newtonNthRoot(99, x) = newtonNthRoot(99, %g) = %g\n", $x, $z);
printf("pow(z, 99) = %g\n", pow($z, 99));
printf("\n");

$x = 3001.0;
$z = newtonNthRoot(-99, $x);
printf("x = %g\n", $x);
printf("exp(log(x)/-99.0) = %g\n", exp(log($x)/-99.0));
printf("z = newtonNthRoot(-99, x) = newtonNthRoot(-99, %g) = %g\n", $x, $z);
printf("1.0/pow(z, 99) = %g\n", 1.0/pow($z, 99));
printf("\n");


printf("2.1**2.1 = pow(2.1, 2.1) = %g\n", pow(2.1, 2.1));
printf("2.1**(-2.1) = pow(2.1, -2.1) = %g\n", pow(2.1, -2.1));
printf("2.1**2.1 * 2.1**(-2.1) = pow(2.1, 2.1) * pow(2.1, -2.1) = %g\n", pow(2.1, 2.1)*pow(2.1, -2.1));
printf("2.1**2.1 = exp(2.1*log(2.1)) = %g\n", exp(2.1*log(2.1)));
printf("2.1**(-2.1) = exp(-2.1*log(2.1)) = %g\n", exp(-2.1*log(2.1)));
printf("2.1**2.1 * 2.1**(-2.1) = exp(2.1*log(2.1)) * exp(-2.1*log(2.1)) = %g\n", exp(2.1*log(2.1)) * exp(-2.1*log(2.1)));
printf("\n");

 

$k = 301;
$x = -1.029;
$t1 = nPow($x, $k);
$t2 = gPow($x, $k);
$t3 = mPow($x, $k);
printf("t1 = nPow(%g, %d) = %g\n", $x, $k, $t1);
printf("t2 = gPow(%g, %d) = %g\n", $x, $k, $t2);
printf("t3 = mPow(%g, %d) = %g\n", $x, $k, $t3);
printf("t1 / t2 = %g\n", $t1 / $t2);
printf("t1 - t2 = %g\n", $t1 - $t2);
printf("t1 == t2 ? %s\n",  $t1 == $t2 ? "yes" : "no");
printf("t1 / t3 = %g\n", $t1 / $t3);
printf("t1 - t3 = %g\n", $t1 - $t3);
printf("t1 == t3 ? %s\n",  $t1 == $t3 ? "yes" : "no");
printf("t2 / t3 = %g\n", $t2 / $t3);
printf("t2 - t3 = %g\n", $t2 - $t3);
printf("t2 == t3 ? %s\n",  $t2 == $t3 ? "yes" : "no");
printf("\n");


printf("Done.\n");


/*
Output:
[ Testing heronSqrt(double) ]--------------------
x = 16
u = sqrt(16) = 4
y = heronSqrt(16) = 4
y*y = 16

[ Testing newtonCbrt(double) ]--------------------
x = -216
-exp(log(-x)/3.0) = -6
w = newtonCbrt(-216) = -6
w*w*w = -216

x = 7.29e+11
exp(log(x)/3.0) = 9000
w = newtonCbrt(7.29e+11) = 9000
w*w*w = 7.29e+11

[ Testing newtonNthRoot(int, double) ]--------------------
x = 7.29e+11
z = newtonNthRoot(3, 7.29e+11) = 9000
z*z*z = 7.29e+11

x = 1.296e+19
z = newtonNthRoot(4, x) = newtonNthRoot(4, 1.296e+19) = 60000
z*z*z*z = 1.296e+19

x = 7.71605e-20
exp(log(x)/4.0) = 1.66667e-5
z = newtonNthRoot(4, x) = newtonNthRoot(4, 7.71605e-20) = 1.66667e-5
z*z*z*z = 7.71605e-20

[ Test Exception heronSqrt(double) ]--------------------
x = -4
Calculating heronSqrt(-4)
Cannot find the sqrt of a negative number.
Caught some exception in calculating heronSqrt(-4)

[ Test Exception in newtonCbrt(double) ]--------------------
x = -4
Calculating newtonCbrt(-4)
y = newtonCbrt(-4) = -1.5874
y*y*y = -4

[ Test calculations by powering ]-----------------------------
x = 200
exp(log(x)/10.0) = 1.69865
z = newtonNthRoot(10, x) = newtonNthRoot(10, 200) = 1.69865
pow(z, 10) = 200

x = 3001
exp(log(x)/99.0) = 1.08424
z = newtonNthRoot(99, x) = newtonNthRoot(99, 3001) = 1.08424
pow(z, 99) = 3001

x = 3001
exp(log(x)/-99.0) = 0.922308
z = newtonNthRoot(-99, x) = newtonNthRoot(-99, 3001) = 0.922308
1.0/pow(z, 99) = 3001

2.1**2.1 = pow(2.1, 2.1) = 4.74964
2.1**(-2.1) = pow(2.1, -2.1) = 0.210542
2.1**2.1 * 2.1**(-2.1) = pow(2.1, 2.1) * pow(2.1, -2.1) = 1
2.1**2.1 = exp(2.1*log(2.1)) = 4.74964
2.1**(-2.1) = exp(-2.1*log(2.1)) = 0.210542
2.1**2.1 * 2.1**(-2.1) = exp(2.1*log(2.1)) * exp(-2.1*log(2.1)) = 1

t1 = nPow(-1.029, 301) = -5457.93
t2 = gPow(-1.029, 301) = -5457.93
t3 = mPow(-1.029, 301) = -5457.93
t1 / t2 = 1
t1 - t2 = 6.18456e-11
t1 == t2 ? no
t1 / t3 = 1
t1 - t3 = 6.18456e-11
t1 == t3 ? no
t2 / t3 = 1
t2 - t3 = 0
t2 == t3 ? yes

Done.
*/

?>

 

 

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데, PHP 언어에서는 asin 함수로 구현되어 있다.

또한 PHP 언어에는 쌍곡선함수 sinhcosh 의 역함수로 각각 asinhacosh 가 구현되어 있지만, 아래의 소스에서 arcsinharccosh 라는 이름의 함수로 자체 구현하였다.

<?php
/*
 * Filename: testArcSine.php
 *
 * Execute: php testArcSine.php
 *
 * Date: 2013. 1. 4.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */

#include <stdio.h>
#include <math.h>

function arcsinh(&$x, &$y) {
    $y = log($x + sqrt($x*$x + 1.0));
    return $y;
}

function arccosh(&$x, &$y) {
    $y = log($x + sqrt($x*$x - 1.0));
    return $y;
}


$x = -0.9;
$y = asin($x);
echo "y = asin($x) = " . sprintf("%.9f", $y) . "\n";
echo "sin(y) = sin(" , sprintf("%.9f", $y) . ") = " . sin($y) . "\n";
echo "\n";

$x = 1.1;
$u = acosh($x);
echo "v = acosh($x) = ". sprintf("%.10f", $u) . "\n";
$v = asinh($x);
echo "v = asinh($x) = ". sprintf("%.10f", $v) . "\n";

echo "cosh(u) = cosh(" . sprintf("%.10f", $u) . ") = ". cosh($u) . "\n";
echo "sinh(v) = sinh(" . sprintf("%.10f", $v) . ") = ". sinh($v) . "\n";
echo "\n";

echo "arccosh($x) = ". sprintf("%.10f", arccosh($x)) . "\n";
echo "arcsinh($x) = ". sprintf("%.10f", arcsinh($x)) . "\n";

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

v = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1

arccosh(1.1) = 0.4435682544
arcsinh(1.1) = 0.9503469298
*/

?>

 

 

 

Posted by Scripter
,