How to use std::signaling_nan?

前端 未结 4 558
伪装坚强ぢ
伪装坚强ぢ 2021-01-12 14:56

After looking at another question on SO (Using NaN in C++) I became curious about std::numeric_limits::signaling_NaN().

I could not get si

相关标签:
4条回答
  • 2021-01-12 15:19

    A word of warning: Using 3rd party DLLs may silently enable these exceptions. This is especially true for loading DLL's that are written in a language that enables them by default.

    I've had that happen in two instances: Printing from an embedded browser control to a HP printer, and registering my DLL (that sets some initial values to NaN) from InnoSetup which is written in Delphi.

    0 讨论(0)
  • 2021-01-12 15:26

    You can use the _control87() function to enable floating-point exceptions. From the MSDN documentation on _control87():

    Note:

    The run-time libraries mask all floating-point exceptions by default.

    When floating point exceptions are enabled, you can use signal() or SEH (Structured Exception Handling) to catch them.

    0 讨论(0)
  • 2021-01-12 15:32

    From TFM:

    cout << "The signaling NaN for type float is:  "
        << numeric_limits<float>::signaling_NaN( )
        << endl;
    

    ->

    The signaling NaN for type float is: 1.#QNAN

    where the 'Q' stands for 'Quiet'. Dunno why it would return that, but that's why it doesn't throw an exception for you.

    Out of curiosity, does this work better?

    const double &real_snan( void )
    {
        static const long long snan = 0x7ff0000080000001LL;
        return *(double*)&snan;
    }
    
    0 讨论(0)
  • 2021-01-12 15:34

    The key lies in numeric_limits<T>::has_signaling_NaN. Which value does this have for you? (The MSDN seems to suggest that it's always false for MSVC?)

    0 讨论(0)
提交回复
热议问题