00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef __SYSDEPS_FPU_H__
00033 #define __SYSDEPS_FPU_H__
00034
00035
00036
00037 #include "SysDeps/host_type.h"
00038
00039 #if defined( COMPILER_IS_MSVC )
00040 #include <float.h>
00041
00042 const int FE_DOWNWARD = _RC_DOWN;
00043 const int FE_UPWARD = _RC_UP;
00044 const int FE_TONEAREST = _RC_NEAR;
00045 const int FE_TOWARDZERO = _RC_CHOP;
00046
00047 inline int fegetround(void)
00048 {
00049 unsigned int fpcr;
00050 _controlfp_s(&fpcr, 0, 0);
00051 return (int)(fpcr & _MCW_RC);
00052 }
00053
00054 inline int fesetround(int rounding_mode)
00055 {
00056 unsigned int fpcr;
00057 return _controlfp_s(&fpcr, (unsigned int)rounding_mode, _MCW_RC);
00058 }
00059
00060
00061 #elif defined( COMPILER_IS_GCC )
00062 # ifndef _GNU_SOURCE
00063 # define _GNU_SOURCE
00064 # endif
00065 # include <fenv.h>
00066 #else
00067 # error "unknown compiler"
00068 #endif
00069
00070 const int FE_ROUNDDEFAULT = FE_TONEAREST;
00071
00072 namespace Onikiri {
00073
00074 class ScopedFESetRound {
00075 public:
00076 ScopedFESetRound(int mode) {
00077 m_oldMode = fegetround();
00078 fesetround(mode);
00079 }
00080 ~ScopedFESetRound() {
00081 fesetround(m_oldMode);
00082 }
00083 private:
00084 int m_oldMode;
00085 };
00086 }
00087
00088 #endif