how do I make a portable isnan/isinf function

前端 未结 11 1505
遇见更好的自我
遇见更好的自我 2020-11-29 06:02

I\'ve been using isinf, isnan functions on Linux platforms which worked perfectly. But this didn\'t work on OS-X, so I decided to use std::is

11条回答
  •  感情败类
    2020-11-29 06:28

    This works under Visual Studio 2008:

    #include 
    #define isnan(x) _isnan(x)
    #define isinf(x) (!_finite(x))
    #define fpu_error(x) (isinf(x) || isnan(x))
    

    For safety, I recommend using fpu_error(). I believe some numbers are picked up with isnan(), and some with isinf(), and you need both to be safe.

    Here is some test code:

    double zero=0;
    double infinite=1/zero;
    double proper_number=4;
    printf("isinf(infinite)=%d.\n",isinf(infinite));
    printf("isinf(proper_number)=%d.\n",isinf(proper_number));
    printf("isnan(infinite)=%d.\n",isnan(infinite));
    printf("isnan(proper_number)=%d.\n",isnan(proper_number));
    
    double num=-4;
    double neg_square_root=sqrt(num);
    printf("isinf(neg_square_root)=%d.\n",isinf(neg_square_root));
    printf("isinf(proper_number)=%d.\n",isinf(proper_number));
    printf("isnan(neg_square_root)=%d.\n",isnan(neg_square_root));
    printf("isnan(proper_number)=%d.\n",isnan(proper_number));
    

    Here is the output:

    isinf(infinite)=1.
    isinf(proper_number)=0.
    isnan(infinite)=0.
    isnan(proper_number)=0.
    isinf(neg_square_root)=1.
    isinf(proper_number)=0.
    isnan(neg_square_root)=1.
    isnan(proper_number)=0.
    

提交回复
热议问题