carl  24.04
Computer ARithmetic Library
rounding_float_t.tpp
Go to the documentation of this file.
1 /*
2  * This file contains the rounding policies needed from the boost interval class
3  * for the FLOAT_T<FloatType> type used in carl.
4  *
5  * @file rounding.h
6  * @author Stefan Schupp <stefan.schupp@cs.rwth-aachen.de>
7  *
8  * @since 2013-12-05
9  * @version 2014-01-30
10  */
11 
12 #pragma once
13 #include "../../numbers/numbers.h"
14 
15 namespace carl
16 {
17  template<typename FloatType>
18  struct rounding<FLOAT_T<FloatType> >
19  {
20  // default constructor, destructor
21 // rounding();
22 // ~rounding();
23  // mathematical operations
24  FLOAT_T<FloatType> add_down(FLOAT_T<FloatType> _lhs, FLOAT_T<FloatType> _rhs) // [-∞;+∞][-∞;+∞]
25  {
26  FLOAT_T<FloatType> result;
27  _lhs.add(result, _rhs, CARL_RND::D );
28  return result;
29  }
30 
31  FLOAT_T<FloatType> add_up(FLOAT_T<FloatType> _lhs, FLOAT_T<FloatType> _rhs) // [-∞;+∞][-∞;+∞]
32  {
33  FLOAT_T<FloatType> result;
34  _lhs.add(result, _rhs, CARL_RND::U );
35  return result;
36  }
37 
38  FLOAT_T<FloatType> sub_down(FLOAT_T<FloatType> _lhs, FLOAT_T<FloatType> _rhs) // [-∞;+∞][-∞;+∞]
39  {
40  FLOAT_T<FloatType> result;
41  _lhs.sub(result, _rhs, CARL_RND::D );
42  return result;
43  }
44 
45  FLOAT_T<FloatType> sub_up (FLOAT_T<FloatType> _lhs, FLOAT_T<FloatType> _rhs) // [-∞;+∞][-∞;+∞]
46  {
47  FLOAT_T<FloatType> result;
48  _lhs.sub(result, _rhs, CARL_RND::U );
49  return result;
50  }
51 
52  FLOAT_T<FloatType> mul_down(FLOAT_T<FloatType> _lhs, FLOAT_T<FloatType> _rhs) // [-∞;+∞][-∞;+∞]
53  {
54  FLOAT_T<FloatType> result;
55  _lhs.mul(result, _rhs, CARL_RND::D );
56  return result;
57  }
58 
59  FLOAT_T<FloatType> mul_up (FLOAT_T<FloatType> _lhs, FLOAT_T<FloatType> _rhs) // [-∞;+∞][-∞;+∞]
60  {
61  FLOAT_T<FloatType> result;
62  _lhs.mul(result, _rhs, CARL_RND::U );
63  return result;
64  }
65 
66  FLOAT_T<FloatType> div_down(FLOAT_T<FloatType> _lhs, FLOAT_T<FloatType> _rhs) // [-∞;+∞]([-∞;+∞]-{0})
67  {
68  FLOAT_T<FloatType> result;
69  _lhs.div(result, _rhs, CARL_RND::D );
70  return result;
71  }
72 
73  FLOAT_T<FloatType> div_up (FLOAT_T<FloatType> _lhs, FLOAT_T<FloatType> _rhs) // [-∞;+∞]([-∞;+∞]-{0})
74  {
75  FLOAT_T<FloatType> result;
76  _lhs.div(result, _rhs, CARL_RND::U );
77  return result;
78  }
79 
80  FLOAT_T<FloatType> sqrt_down(FLOAT_T<FloatType> _val) // ]0;+∞]
81  {
82  if( _val <= 0 )
83  return FLOAT_T<FloatType>(0);
84 
85  FLOAT_T<FloatType> result;
86  _val.sqrt(result, CARL_RND::D );
87  return result;
88  }
89  FLOAT_T<FloatType> sqrt_up (FLOAT_T<FloatType> _val) // ]0;+∞]
90  {
91  if( _val <= 0 )
92  return FLOAT_T<FloatType>(0);
93 
94  FLOAT_T<FloatType> result;
95  _val.sqrt(result, CARL_RND::U );
96  return result;
97  }
98  FLOAT_T<FloatType> exp_down(FLOAT_T<FloatType> _val) // [-∞;+∞]
99  {
100  FLOAT_T<FloatType> result;
101  _val.exp(result, CARL_RND::D );
102  return result;
103  }
104  FLOAT_T<FloatType> exp_up (FLOAT_T<FloatType> _val) // [-∞;+∞]
105  {
106  FLOAT_T<FloatType> result;
107  _val.exp(result, CARL_RND::U );
108  return result;
109  }
110  FLOAT_T<FloatType> log_down(FLOAT_T<FloatType> _val) // ]0;+∞]
111  {
112  FLOAT_T<FloatType> result;
113  _val.log(result, CARL_RND::D );
114  return result;
115  }
116  FLOAT_T<FloatType> log_up (FLOAT_T<FloatType> _val) // ]0;+∞]
117  {
118  FLOAT_T<FloatType> result;
119  _val.log(result, CARL_RND::U );
120  return result;
121  }
122  FLOAT_T<FloatType> cos_down(FLOAT_T<FloatType> _val) // [0;2π]
123  {
124  FLOAT_T<FloatType> result;
125  _val.cos(result, CARL_RND::D );
126  return result;
127  }
128  FLOAT_T<FloatType> cos_up (FLOAT_T<FloatType> _val) // [0;2π]
129  {
130  FLOAT_T<FloatType> result;
131  _val.cos(result, CARL_RND::U );
132  return result;
133  }
134  FLOAT_T<FloatType> tan_down(FLOAT_T<FloatType> _val) // ]-π/2;π/2[
135  {
136  FLOAT_T<FloatType> result;
137  _val.tan(result, CARL_RND::D );
138  return result;
139  }
140  FLOAT_T<FloatType> tan_up (FLOAT_T<FloatType> _val) // ]-π/2;π/2[
141  {
142  FLOAT_T<FloatType> result;
143  _val.tan(result, CARL_RND::U );
144  return result;
145  }
146  FLOAT_T<FloatType> asin_down(FLOAT_T<FloatType> _val) // [-1;1]
147  {
148  FLOAT_T<FloatType> result;
149  _val.asin(result, CARL_RND::D );
150  return result;
151  }
152  FLOAT_T<FloatType> asin_up (FLOAT_T<FloatType> _val) // [-1;1]
153  {
154  FLOAT_T<FloatType> result;
155  _val.asin(result, CARL_RND::U );
156  return result;
157  }
158  FLOAT_T<FloatType> acos_down(FLOAT_T<FloatType> _val) // [-1;1]
159  {
160  FLOAT_T<FloatType> result;
161  _val.acos(result, CARL_RND::D );
162  return result;
163  }
164  FLOAT_T<FloatType> acos_up (FLOAT_T<FloatType> _val) // [-1;1]
165  {
166  FLOAT_T<FloatType> result;
167  _val.acos(result, CARL_RND::U );
168  return result;
169  }
170  FLOAT_T<FloatType> atan_down(FLOAT_T<FloatType> _val) // [-∞;+∞]
171  {
172  FLOAT_T<FloatType> result;
173  _val.atan(result, CARL_RND::D );
174  return result;
175  }
176  FLOAT_T<FloatType> atan_up (FLOAT_T<FloatType> _val) // [-∞;+∞]
177  {
178  FLOAT_T<FloatType> result;
179  _val.atan(result, CARL_RND::U );
180  return result;
181  }
182  FLOAT_T<FloatType> sinh_down(FLOAT_T<FloatType> _val) // [-∞;+∞]
183  {
184  FLOAT_T<FloatType> result;
185  _val.sinh(result, CARL_RND::D );
186  return result;
187  }
188  FLOAT_T<FloatType> sinh_up (FLOAT_T<FloatType> _val) // [-∞;+∞]
189  {
190  FLOAT_T<FloatType> result;
191  _val.sinh(result, CARL_RND::U );
192  return result;
193  }
194  FLOAT_T<FloatType> cosh_down(FLOAT_T<FloatType> _val) // [-∞;+∞]
195  {
196  FLOAT_T<FloatType> result;
197  _val.cosh(result, CARL_RND::D );
198  return result;
199  }
200  FLOAT_T<FloatType> cosh_up (FLOAT_T<FloatType> _val) // [-∞;+∞]
201  {
202  FLOAT_T<FloatType> result;
203  _val.cosh(result, CARL_RND::U );
204  return result;
205  }
206  FLOAT_T<FloatType> tanh_down(FLOAT_T<FloatType> _val) // [-∞;+∞]
207  {
208  FLOAT_T<FloatType> result;
209  _val.tanh(result, CARL_RND::D );
210  return result;
211  }
212  FLOAT_T<FloatType> tanh_up (FLOAT_T<FloatType> _val) // [-∞;+∞]
213  {
214  FLOAT_T<FloatType> result;
215  _val.tanh(result, CARL_RND::U );
216  return result;
217  }
218  FLOAT_T<FloatType> asinh_down(FLOAT_T<FloatType> _val) // [-∞;+∞]
219  {
220  FLOAT_T<FloatType> result;
221  _val.asinh(result, CARL_RND::D );
222  return result;
223  }
224  FLOAT_T<FloatType> asinh_up (FLOAT_T<FloatType> _val) // [-∞;+∞]
225  {
226  FLOAT_T<FloatType> result;
227  _val.asinh(result, CARL_RND::U );
228  return result;
229  }
230  FLOAT_T<FloatType> acosh_down(FLOAT_T<FloatType> _val) // [1;+∞]
231  {
232  FLOAT_T<FloatType> result;
233  _val.acosh(result, CARL_RND::D );
234  return result;
235  }
236  FLOAT_T<FloatType> acosh_up (FLOAT_T<FloatType> _val) // [1;+∞]
237  {
238  FLOAT_T<FloatType> result;
239  _val.acosh(result, CARL_RND::U );
240  return result;
241  }
242  FLOAT_T<FloatType> atanh_down(FLOAT_T<FloatType> _val) // [-1;1]
243  {
244  FLOAT_T<FloatType> result;
245  _val.atanh(result, CARL_RND::D );
246  return result;
247  }
248  FLOAT_T<FloatType> atanh_up (FLOAT_T<FloatType> _val) // [-1;1]
249  {
250  FLOAT_T<FloatType> result;
251  _val.atanh(result, CARL_RND::U );
252  return result;
253  }
254  FLOAT_T<FloatType> median(FLOAT_T<FloatType> _val1, FLOAT_T<FloatType> _val2) // [-∞;+∞][-∞;+∞]
255  {
256  // @todo: Median <. arithmetisches Mittel ???
257  FLOAT_T<FloatType> result;
258  result.add_assign(_val1);
259  result.add_assign(_val2);
260  result.div_assign(FLOAT_T<FloatType>(2));
261  return result;
262  }
263  FLOAT_T<FloatType> int_down(FLOAT_T<FloatType> _val) // [-∞;+∞]
264  {
265  FLOAT_T<FloatType> result;
266  _val.floor(result, CARL_RND::D );
267  return result;
268  }
269  FLOAT_T<FloatType> int_up (FLOAT_T<FloatType> _val) // [-∞;+∞]
270  {
271  FLOAT_T<FloatType> result;
272  _val.ceil(result, CARL_RND::U );
273  return result;
274  }
275  // conversion functions
276  template<typename U>
277  FLOAT_T<FloatType> conv_down(U _val)
278  {
279  return FLOAT_T<FloatType>(_val, CARL_RND::D );
280  }
281 
282  template<typename U>
283  FLOAT_T<FloatType> conv_up(U _val)
284  {
285  return FLOAT_T<FloatType>(_val, CARL_RND::U );
286  }
287  // unprotected rounding class
288 // typedef ... unprotected_rounding;
289  };
290 }