Float

본문

Float 부동 소수점 숫자(“float”, “double” 또는 “real number”라고도 합니다)는 다음 구문 중 하나를 사용하여 지정할 수 있습니다.

<?php
    $a = 1.234;
    $b = 1.2e3;
    $c = 7E-10;
?>

공식적인 Float의 표기 구조는 다음과 같습니다.

LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM}

Float의 크기는 플랫폼에 따라 다르지만 대략 14자리의 정밀도로 최대 약 1.8e308(64비트 IEEE 형식)이 일반적인 값입니다.

Float의 정밀도

Float는 정밀도가 제한되어 있습니다. PHP는 시스템에 따라 다르지만 일반적으로 IEEE 754 배정도 형식을 사용하는 과정에서 1.11e-16 순서의 반올림으로 최대 상대 오류가 발생합니다. 기본이 아닌 산술 연산은 더욱 큰 오차를 줄 수 있으며, 여러 연산이 복합되는 경우 오류 전파를 고려해야 합니다.

또한 0.1 또는 0.7과 같이 10 진수의 값으로 정확하게 표현할 수 있는 유리수는 가수의 크기에 상관없이 내부에서 사용되는 2진수의 Float로 정확하게 표현되지 않습니다. 예를 들어 floor ((0.1 + 0.7) * 10)은 일반적으로 예상하는 값인 8 대신 7을 반환합니다. 내부 표현은 7.9999999999999991118과 비슷하기 때문입니다.

IEEE 754 표준을 참조하십시오. (외부 링크)

String을 Float으로 변환하는 방법에 대한 자세한 내용은 String을 Integer로 변환을 참조하십시오. 다른 유형의 값을 변환하는 경우 Integer로 변환된 값이 Float로 다시 한번 변환됩니다. 자세한 내용은 Integer로 변환을 참조하십시오. PHP 5부터 Object가 Float로 변환되면 알림이 발생합니다.

Float의 비교

위에서 언급한 내용과 같이 Float의 값이 동일한지 테스트하는 것은 내부적으로 표현되는 방식으로 인해 문제를 일으킬 가능성이 있습니다. 그러나 이러한 제한을 해결하는 Float의 값을 비교하는 방법이 있습니다.

Float의 값이 같은지 테스트하기 위해 반올림으로 인한 상대 오류의 상한이 사용됩니다. 이 값을 머신 엡실론 또는 단위 반올림이라고하며 계산에서 허용되는 가장 작은 차이입니다.

$a$b 는 5자리의 정밀도입니다.

<?php
    $a = 1.23456789;
    $b = 1.23456780;
    $epsilon = 0.00001;

    if(abs($a-$b) < $epsilon) {
        echo "true";
    }
?>

NaN

일부 숫자 연산은 상수 NaN으로 표시되는 값을 초래할 수 있습니다. 이 결과는 Float를 이용하는 계산에서 정의되지 않거나 표현할 수 없는 값을 나타냅니다. TRUE를 제외한 경우에서 NaN 자신을 포함하여 다른 값과 비교하는 경우 값을 느슨하거나 엄격하게 비교하면 FALSE를 출력합니다.

NaN은 여러 개의 다른 값을 나타내므로 NaN은 자신을 포함하여 다른 값과 비교해서는 안되며 대신 is_nan()을 사용하여 확인해야 합니다.

The source of this document is at PHP.net.   
php  ccl-by-4.0

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다