1 //
2 // FPEnvironment.h
3 //
4 // Library: Foundation
5 // Package: Core
6 // Module: FPEnvironment
7 //
8 // Definitions of class FPEnvironment.
9 //
10 // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
11 // and Contributors.
12 //
13 // SPDX-License-Identifier: BSL-1.0
14 //
15
16
17 #ifndef Foundation_FPEnvironment_INCLUDED
18 #define Foundation_FPEnvironment_INCLUDED
19
20
21 #include "Poco/Foundation.h"
22
23
24 #if defined(POCO_NO_FPENVIRONMENT)
25 #include "Poco/FPEnvironment_DUMMY.h"
26 #elif defined(__osf__)
27 #include "Poco/FPEnvironment_DEC.h"
28 #elif defined(sun) || defined(__sun)
29 #include "Poco/FPEnvironment_SUN.h"
30 #elif defined(__QNX__)
31 #include "Poco/FPEnvironment_QNX.h"
32 #elif defined(POCO_OS_FAMILY_UNIX)
33 #include "Poco/FPEnvironment_C99.h"
34 #elif defined(POCO_OS_FAMILY_WINDOWS)
35 #include "Poco/FPEnvironment_WIN32.h"
36 #else
37 #include "Poco/FPEnvironment_DUMMY.h"
38 #endif
39
40
41 namespace Poco {
42
43
44 class Foundation_API FPEnvironment: private FPEnvironmentImpl
45 /// Instances of this class can be used to save
46 /// and later restore the current floating
47 /// point environment (consisting of rounding
48 /// mode and floating-point flags).
49 /// The class also provides various static
50 /// methods to query certain properties
51 /// of a floating-point number.
52 {
53 public:
54 enum RoundingMode
55 {
56 FP_ROUND_DOWNWARD = FP_ROUND_DOWNWARD_IMPL,
57 FP_ROUND_UPWARD = FP_ROUND_UPWARD_IMPL,
58 FP_ROUND_TONEAREST = FP_ROUND_TONEAREST_IMPL,
59 FP_ROUND_TOWARDZERO = FP_ROUND_TOWARDZERO_IMPL
60 };
61
62 enum Flag
63 {
64 FP_DIVIDE_BY_ZERO = FP_DIVIDE_BY_ZERO_IMPL,
65 FP_INEXACT = FP_INEXACT_IMPL,
66 FP_OVERFLOW = FP_OVERFLOW_IMPL,
67 FP_UNDERFLOW = FP_UNDERFLOW_IMPL,
68 FP_INVALID = FP_INVALID_IMPL
69 };
70
71 FPEnvironment();
72 /// Standard constructor.
73 /// Remembers the current environment.
74
75 FPEnvironment(RoundingMode mode);
76 /// Remembers the current environment and
77 /// sets the given rounding mode.
78
79 FPEnvironment(const FPEnvironment& env);
80 /// Copy constructor.
81
82 ~FPEnvironment();
83 /// Restores the previous environment (unless
84 /// keepCurrent() has been called previously)
85
86 FPEnvironment& operator = (const FPEnvironment& env);
87 /// Assignment operator
88
89 void keepCurrent();
90 /// Keep the current environment even after
91 /// destroying the FPEnvironment object.
92
93 static void clearFlags();
94 /// Resets all flags.
95
96 static bool isFlag(Flag flag);
97 /// Returns true iff the given flag is set.
98
99 static void setRoundingMode(RoundingMode mode);
100 /// Sets the rounding mode.
101
102 static RoundingMode getRoundingMode();
103 /// Returns the current rounding mode.
104
105 static bool isInfinite(float value);
106 static bool isInfinite(double value);
107 static bool isInfinite(long double value);
108 /// Returns true iff the given number is infinite.
109
110 static bool isNaN(float value);
111 static bool isNaN(double value);
112 static bool isNaN(long double value);
113 /// Returns true iff the given number is NaN.
114
115 static float copySign(float target, float source);
116 static double copySign(double target, double source);
117 static long double copySign(long double target, long double source);
118 /// Copies the sign from source to target.
119 };
120
121
122 //
123 // For convenience, we provide a shorter name for
124 // the FPEnvironment class.
125 //
126 typedef FPEnvironment FPE;
127
128
129 //
130 // inline's
131 //
isFlag(Flag flag)132 inline bool FPEnvironment::isFlag(Flag flag)
133 {
134 return isFlagImpl(FlagImpl(flag));
135 }
136
137
setRoundingMode(RoundingMode mode)138 inline void FPEnvironment::setRoundingMode(RoundingMode mode)
139 {
140 setRoundingModeImpl(RoundingModeImpl(mode));
141 }
142
143
getRoundingMode()144 inline FPEnvironment::RoundingMode FPEnvironment::getRoundingMode()
145 {
146 return RoundingMode(getRoundingModeImpl());
147 }
148
149
isInfinite(float value)150 inline bool FPEnvironment::isInfinite(float value)
151 {
152 return isInfiniteImpl(value);
153 }
154
155
isInfinite(double value)156 inline bool FPEnvironment::isInfinite(double value)
157 {
158 return isInfiniteImpl(value);
159 }
160
161
isInfinite(long double value)162 inline bool FPEnvironment::isInfinite(long double value)
163 {
164 return isInfiniteImpl(value);
165 }
166
167
isNaN(float value)168 inline bool FPEnvironment::isNaN(float value)
169 {
170 return isNaNImpl(value);
171 }
172
173
isNaN(double value)174 inline bool FPEnvironment::isNaN(double value)
175 {
176 return isNaNImpl(value);
177 }
178
179
isNaN(long double value)180 inline bool FPEnvironment::isNaN(long double value)
181 {
182 return isNaNImpl(value);
183 }
184
185
copySign(float target,float source)186 inline float FPEnvironment::copySign(float target, float source)
187 {
188 return copySignImpl(target, source);
189 }
190
191
copySign(double target,double source)192 inline double FPEnvironment::copySign(double target, double source)
193 {
194 return copySignImpl(target, source);
195 }
196
197
copySign(long double target,long double source)198 inline long double FPEnvironment::copySign(long double target, long double source)
199 {
200 return copySignImpl(target, source);
201 }
202
203
204 } // namespace Poco
205
206
207 #endif // Foundation_FPEnvironment_INCLUDED
208