Generated on Wed Jul 21 2021 00:00:00 for Gecode by doxygen 1.9.1
rounding.hpp
Go to the documentation of this file.
1 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2 /*
3  * Main authors:
4  * Christian Schulte <schulte@gecode.org>
5  *
6  * Copyright:
7  * Christian Schulte, 2012
8  *
9  * This file is part of Gecode, the generic constraint
10  * development environment:
11  * http://www.gecode.org
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining
14  * a copy of this software and associated documentation files (the
15  * "Software"), to deal in the Software without restriction, including
16  * without limitation the rights to use, copy, modify, merge, publish,
17  * distribute, sublicense, and/or sell copies of the Software, and to
18  * permit persons to whom the Software is furnished to do so, subject to
19  * the following conditions:
20  *
21  * The above copyright notice and this permission notice shall be
22  * included in all copies or substantial portions of the Software.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31  *
32  */
33 
34 namespace Gecode { namespace Float {
35 
38  RoundingBase::init();
39  }
42 
45  return RoundingBase::median(x,y);
46  }
47 
48 #define GECODE_ROUND_OP(name) \
49  forceinline FloatNum \
50  Rounding::name##_down(FloatNum x, FloatNum y) { \
51  return RoundingBase::name##_down(x,y); \
52  } \
53  forceinline FloatNum \
54  Rounding::name##_up(FloatNum x, FloatNum y) { \
55  return RoundingBase::name##_up(x,y); \
56  }
57 
58  GECODE_ROUND_OP(add)
59  GECODE_ROUND_OP(sub)
60  GECODE_ROUND_OP(mul)
61  GECODE_ROUND_OP(div)
62 
63 #undef GECODE_ROUND_OP
64 
65 #define GECODE_ROUND_FUN(name) \
66  forceinline FloatNum \
67  Rounding::name##_down(FloatNum x) { \
68  return RoundingBase::name##_down(x); \
69  } \
70  forceinline FloatNum \
71  Rounding::name##_up(FloatNum x) { \
72  return RoundingBase::name##_up(x); \
73  }
74 
75  GECODE_ROUND_FUN(sqrt)
76 
77 #if defined(_M_X64) || defined(_M_IA64)
78 
79  // Workaround as MSVC on x64 does not have a rint function
82  return floor(x);
83  }
86  return ceil(x);
87  }
88 
89 #else
90 
91  GECODE_ROUND_FUN(int)
92 
93 #endif
94 
95 #undef GECODE_ROUND_FUN
96 
97 }}
98 
99 // STATISTICS: float-var
100 
Node * x
Pointer to corresponding Boolean expression node.
Definition: bool-expr.cpp:249
~Rounding(void)
Destructor (restores previous rounding mode)
Definition: rounding.hpp:41
FloatNum int_up(FloatNum x)
Return next upward-rounded integer of x (domain: )
FloatNum int_down(FloatNum x)
Return next downward-rounded integer of x (domain: )
FloatNum median(FloatNum x, FloatNum y)
Return median of x and y (domain: )
Definition: rounding.hpp:44
Rounding(void)
Default constructor (configures full rounding mode)
Definition: rounding.hpp:37
Post propagator for SetVar SetOpType SetVar y
Definition: set.hh:767
double FloatNum
Floating point number base type.
Definition: float.hh:106
#define GECODE_ROUND_FUN(name)
Definition: rounding.hpp:65
#define GECODE_ROUND_OP(name)
Definition: rounding.hpp:48
#define forceinline
Definition: config.hpp:192