1 /** 2 * Name: wx/math.h 3 * Purpose: Declarations/definitions of common math functions 4 * Author: John Labenski and others 5 * Modified by: 6 * Created: 02/02/03 7 * RCS-ID: $Id: math.h 62541 2009-11-03 14:10:46Z VZ $ 8 * Copyright: (c) John Labenski 9 * Licence: wxWindows licence 10 */ 11 12 /* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */ 13 14 #ifndef _WX_MATH_H_ 15 #define _WX_MATH_H_ 16 17 #include "wx/defs.h" 18 19 #include <math.h> 20 21 #ifndef M_PI 22 #define M_PI 3.1415926535897932384626433832795 23 #endif 24 25 /* Scaling factors for various unit conversions */ 26 #ifndef METRIC_CONVERSION_CONSTANT 27 #define METRIC_CONVERSION_CONSTANT 0.0393700787 28 #endif 29 30 #ifndef mm2inches 31 #define mm2inches (METRIC_CONVERSION_CONSTANT) 32 #endif 33 34 #ifndef inches2mm 35 #define inches2mm (1/(mm2inches)) 36 #endif 37 38 #ifndef mm2twips 39 #define mm2twips (METRIC_CONVERSION_CONSTANT*1440) 40 #endif 41 42 #ifndef twips2mm 43 #define twips2mm (1/(mm2twips)) 44 #endif 45 46 #ifndef mm2pt 47 #define mm2pt (METRIC_CONVERSION_CONSTANT*72) 48 #endif 49 50 #ifndef pt2mm 51 #define pt2mm (1/(mm2pt)) 52 #endif 53 54 55 /* unknown __VISAGECC__, __SYMANTECCC__ */ 56 57 #if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) 58 #include <float.h> 59 #define wxFinite(x) _finite(x) 60 #elif defined(__GNUG__)||defined(__GNUWIN32__)||defined(__DJGPP__)|| \ 61 defined(__SGI_CC__)||defined(__SUNCC__)||defined(__XLC__)|| \ 62 defined(__HPUX__)||defined(__MWERKS__) 63 #define wxFinite(x) finite(x) 64 #else 65 #define wxFinite(x) ((x) == (x)) 66 #endif 67 68 69 #if defined(__VISUALC__)||defined(__BORLAND__) 70 #define wxIsNaN(x) _isnan(x) 71 #elif defined(__GNUG__)||defined(__GNUWIN32__)||defined(__DJGPP__)|| \ 72 defined(__SGI_CC__)||defined(__SUNCC__)||defined(__XLC__)|| \ 73 defined(__HPUX__)||defined(__MWERKS__) 74 #define wxIsNaN(x) isnan(x) 75 #else 76 #define wxIsNaN(x) ((x) != (x)) 77 #endif 78 79 #ifdef __cplusplus 80 81 #ifdef __INTELC__ 82 wxIsSameDouble(double x,double y)83 inline bool wxIsSameDouble(double x, double y) 84 { 85 // VZ: this warning, given for operators==() and !=() is not wrong, as == 86 // shouldn't be used with doubles, but we get too many of them and 87 // removing these operators is probably not a good idea 88 // 89 // Maybe we should alway compare doubles up to some "epsilon" precision 90 #pragma warning(push) 91 92 // floating-point equality and inequality comparisons are unreliable 93 #pragma warning(disable: 1572) 94 95 return x == y; 96 97 #pragma warning(pop) 98 } 99 100 #else /* !__INTELC__ */ 101 wxIsSameDouble(double x,double y)102 inline bool wxIsSameDouble(double x, double y) { return x == y; } 103 104 #endif /* __INTELC__/!__INTELC__ */ 105 wxIsNullDouble(double x)106 inline bool wxIsNullDouble(double x) { return wxIsSameDouble(x, 0.); } 107 wxRound(double x)108 inline int wxRound(double x) 109 { 110 #if defined(HAVE_ROUND) 111 return int(round(x)); 112 #else 113 return (int)(x < 0 ? x - 0.5 : x + 0.5); 114 #endif 115 } 116 #endif /* __cplusplus */ 117 118 119 #if defined(__WXMSW__) && !defined(__WXWINCE__) 120 #define wxMulDivInt32( a , b , c ) ::MulDiv( a , b , c ) 121 #elif defined( __WXMAC__ ) 122 #define wxMulDivInt32( a , b , c ) ( (wxInt32) ( ( (wxInt64)(a) * (wxInt64)(b) ) / (wxInt64)(c) ) ) 123 #else 124 #define wxMulDivInt32( a , b , c ) ((wxInt32)((a)*(((wxDouble)b)/((wxDouble)c)))) 125 #endif 126 127 #if wxUSE_APPLE_IEEE 128 #ifdef __cplusplus 129 extern "C" { 130 #endif 131 /* functions from common/extended.c */ 132 WXDLLEXPORT wxFloat64 ConvertFromIeeeExtended(const wxInt8 *bytes); 133 WXDLLEXPORT void ConvertToIeeeExtended(wxFloat64 num, wxInt8 *bytes); 134 #ifdef __cplusplus 135 } 136 #endif 137 #endif /* wxUSE_APPLE_IEEE */ 138 139 140 #endif /* _WX_MATH_H_ */ 141