GCC problem with raw double type comparisons

前端 未结 3 1475
孤独总比滥情好
孤独总比滥情好 2021-01-05 03:54

I have the following bit of code, however when compiling it with GCC 4.4 with various optimization flags I get some unexpected results when its run.

#include         


        
3条回答
  •  天命终不由人
    2021-01-05 04:25

    The fact that the result depends on the optimization settings suggests it might be the x87 extended precision messing with things (as Michael Burr says).

    Here's some code I use (with gcc on x86 processors) to switch the extended precision off:

    static const unsigned int PRECISION_BIT_MASK = 0x300;
    ///< bitmask to mask out all non-precision bits in the fpu control word \cite{INTEL}.
    static const unsigned int EXTENDED_PRECISION_BITS = 0x300;
    ///< add to the fpu control word (after zeroing precision bits) to turn on extended precision \cite{INTEL}.
    static const unsigned int STANDARD_PRECISION_BITS = 0x200;
    ///< add to the fpu control word (after zeroing precision bits) to turn off extended precision \cite{INTEL}.
    
    void set_fpu_control_word(unsigned int mode)
    {
      asm ("fldcw %0" : : "m" (*&mode));
    }
    
    unsigned int get_fpu_control_word()
    {
      volatile unsigned int mode = 0;
      asm ("fstcw %0" : "=m" (*&mode));
      return mode;
    }
    
    bool fpu_set_extended_precision_is_on(bool state)
    {
      unsigned int old_cw = get_fpu_control_word();
      unsigned int masked = old_cw & ~PRECISION_BIT_MASK;
      unsigned int new_cw;
      if(state)
        new_cw = masked + EXTENDED_PRECISION_BITS;
      else
        new_cw = masked + STANDARD_PRECISION_BITS;
      set_fpu_control_word(new_cw);
      return true;
    }
    
    bool fpu_get_extended_precision_is_on()
    {
      unsigned int old_cw = get_fpu_control_word();
      return  ((old_cw & PRECISION_BIT_MASK) == 0x300);
    }
    

    Or you can just run your code with valgrind, which doesn't simulate the 80-bit registers, and is probably easier for a short program like this!

提交回复
热议问题