ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PHP7 NAN INF 출력 오류가 나는 이유 IEEE 754 변경
    프로그램/php 2017. 3. 1. 07:30


    PHP7 NAN INF 출력 오류가 나는 이유


    최근에 회사에서 PHP 버전을 바꿔 작업을 하기 시작했다

    PHP 버전이 바뀌면서 생기는 문제점 들은 처음 작업을 시작 하면서 부터 발생 하였는데

    우린 Codeigniter 를 사용해서 Codeigniter 의 버전도 같이 올려서 더 많은 오류가 발생 했다


    너무 많은 오류가 발생하여 다 정리하진 못하였지만

    최근에 눈에 띄고 있는 오류가 있어 포스팅을 한다


    바로 NAN , INF 라는 문제가 발생하는건데

    이건 자바스크립트에서나 자주 봤던건데 PHP에서도 보이니까 아주 신선했다


    이 둘의 뜻


    NAN (Not a Number) 부동 소수점 계산에 정의 또는 표현 할 수 없는 값 쉽게 말해 숫자가 아닐 경우에 나타나는 것을 확인 할 수 있다

    INF (The infinite) 무한대를 나타낸다 일반적으로 표현이 불가능한 매우 큰 수를 뜻 한다


    그래서 php.net 에서 INF란 무엇인지 알아 봤다


    echo 5000  < INF ? 'yes' : 'no';        // outputs 'yes'

    echo INF    < INF ? 'yes' : 'no';      // outputs 'no'

    echo INF    <= INF ? 'yes' : 'no';        // outputs 'yes'

    echo INF    == INF ? 'yes' : 'no';        // outputs 'yes'




    이러한 부분들은 다른 언어 Java 에선 아주 명료하게 잡아내서 문제가 없겠지만 PHP에선 PHP7으로 오면서 이 부분들에 대해

     IEEE 754 가 변경되었다고 한다


    원래는 PHP7 이전 버전에선 bool 처리가 되어 숫자 0으로 떨어지고 경고만 뿜었었다

    PHP의 경고창은 일반적으로 오픈해놓지 않기 때문에 그냥 그러려니 했었는데

    7이 되면서 부턴 이 부분에 대해 명확하게 표현을 하려고 하는거 같다


    >> PHP7 이전

    Warning: Division by zero in %s on line %d

    bool(false)


    Warning: Division by zero in %s on line %d

    bool(false)


    Warning: Division by zero in %s on line %d

    bool(false)



    >> PHP7

    Warning: Division by zero in %s on line %d

    float(INF)


    Warning: Division by zero in %s on line %d

    float(NAN)




    위 오류를 확인 해 볼 수 있는 예시는 이렇게 하면 바로 확인 할 수 있다


    >> 샘플 코드
    var_dump(3/0);
    var_dump(0/0);
    var_dump(0%0);

    이를 해결 할 수 있는 방법은

    여러가지가 있겠지만 일단 근본적인 부분 부터 수정해줘야 한다

    임시방편으로 처리 하기 위해선 아래 방법으로 분기하여 처리 할 수 있지만 근복적으로 저러한 값으로

    나뉘지 않도록 하는게 제일 좋겠다


    NAN      ->    is_nan()

    INF        ->    is_infinite()


    댓글

Designed by Tistory.