p1788 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +8 -0
  3. data/AUTHORS +6 -0
  4. data/LICENSE +201 -0
  5. data/NOTICE +29 -0
  6. data/README.md +65 -0
  7. data/ext/libieeep1788_copy/README +3 -0
  8. data/ext/libieeep1788_copy/p1788/AUTHORS +16 -0
  9. data/ext/libieeep1788_copy/p1788/LICENSE +202 -0
  10. data/ext/libieeep1788_copy/p1788/NOTICE +14 -0
  11. data/ext/libieeep1788_copy/p1788/decoration/decoration.hpp +265 -0
  12. data/ext/libieeep1788_copy/p1788/exception/exception.hpp +302 -0
  13. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor.hpp +3443 -0
  14. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_bool_func_impl.hpp +608 -0
  15. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_cancel_func_impl.hpp +229 -0
  16. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_class_impl.hpp +526 -0
  17. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_elem_func_impl.hpp +4533 -0
  18. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_io_impl.hpp +1421 -0
  19. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_mul_rev_to_pair_func_impl.hpp +347 -0
  20. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_num_func_impl.hpp +655 -0
  21. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_rec_bool_func_impl.hpp +146 -0
  22. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_rec_overlap_impl.hpp +188 -0
  23. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_rev_func_impl.hpp +1674 -0
  24. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_set_op_impl.hpp +216 -0
  25. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_setup_func_impl.hpp +68 -0
  26. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_util_func_impl.hpp +135 -0
  27. data/ext/libieeep1788_copy/p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor_validation_func_impl.hpp +93 -0
  28. data/ext/libieeep1788_copy/p1788/infsup/base_interval.hpp +1529 -0
  29. data/ext/libieeep1788_copy/p1788/infsup/base_interval_bool_func_impl.hpp +481 -0
  30. data/ext/libieeep1788_copy/p1788/infsup/base_interval_cancel_func_impl.hpp +126 -0
  31. data/ext/libieeep1788_copy/p1788/infsup/base_interval_elem_func_impl.hpp +1581 -0
  32. data/ext/libieeep1788_copy/p1788/infsup/base_interval_io_impl.hpp +59 -0
  33. data/ext/libieeep1788_copy/p1788/infsup/base_interval_mul_rev_to_pair_func_impl.hpp +88 -0
  34. data/ext/libieeep1788_copy/p1788/infsup/base_interval_num_func_impl.hpp +345 -0
  35. data/ext/libieeep1788_copy/p1788/infsup/base_interval_rec_bool_func_impl.hpp +92 -0
  36. data/ext/libieeep1788_copy/p1788/infsup/base_interval_rec_overlap_impl.hpp +72 -0
  37. data/ext/libieeep1788_copy/p1788/infsup/base_interval_rev_func_impl.hpp +656 -0
  38. data/ext/libieeep1788_copy/p1788/infsup/base_interval_set_op_impl.hpp +126 -0
  39. data/ext/libieeep1788_copy/p1788/infsup/decorated_interval.hpp +464 -0
  40. data/ext/libieeep1788_copy/p1788/infsup/forward_declaration.hpp +66 -0
  41. data/ext/libieeep1788_copy/p1788/infsup/interval.hpp +275 -0
  42. data/ext/libieeep1788_copy/p1788/io/io_manip.hpp +531 -0
  43. data/ext/libieeep1788_copy/p1788/overlapping/overlapping.hpp +241 -0
  44. data/ext/libieeep1788_copy/p1788/p1788.hpp +45 -0
  45. data/ext/libieeep1788_copy/p1788/reduction/reduction.hpp +341 -0
  46. data/ext/libieeep1788_copy/p1788/util/io.hpp +63 -0
  47. data/ext/libieeep1788_copy/p1788/util/mixed_type_traits.hpp +140 -0
  48. data/ext/libieeep1788_copy/p1788/util/mpfr_util.hpp +77 -0
  49. data/ext/libieeep1788_copy/p1788/util/mpfr_var.hpp +119 -0
  50. data/ext/libieeep1788_copy/p1788/util/mpfr_var_impl.hpp +382 -0
  51. data/ext/libieeep1788_copy/p1788/version.hpp +34 -0
  52. data/ext/p1788/extconf.rb +49 -0
  53. data/ext/p1788/p1788.cc +3764 -0
  54. data/lib/p1788/version.rb +4 -0
  55. data/lib/p1788.rb +25 -0
  56. data/p1788.gemspec +72 -0
  57. metadata +99 -0
@@ -0,0 +1,241 @@
1
+ //
2
+ // libieeep1788
3
+ //
4
+ // An implementation of the preliminary IEEE P1788 standard for
5
+ // interval arithmetic
6
+ //
7
+ //
8
+ // Copyright 2013 - 2015
9
+ //
10
+ // Marco Nehmeier (nehmeier@informatik.uni-wuerzburg.de)
11
+ // Department of Computer Science,
12
+ // University of Wuerzburg, Germany
13
+ //
14
+ // Licensed under the Apache License, Version 2.0 (the "License");
15
+ // you may not use this file except in compliance with the License.
16
+ // You may obtain a copy of the License at
17
+ //
18
+ // http://www.apache.org/licenses/LICENSE-2.0
19
+ //
20
+ // Unless required by applicable law or agreed to in writing, software
21
+ // distributed under the License is distributed on an "AS IS" BASIS,
22
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
+ // See the License for the specific language governing permissions and
24
+ // limitations under the License.
25
+
26
+
27
+ #ifndef LIBIEEEP1788_P1788_OVERLAPPING_OVERLAPPING_HPP
28
+ #define LIBIEEEP1788_P1788_OVERLAPPING_OVERLAPPING_HPP
29
+
30
+ #include <iostream>
31
+ #include "p1788/io/io_manip.hpp"
32
+
33
+ #include <cstdint>
34
+
35
+ namespace p1788
36
+ {
37
+
38
+ namespace overlapping
39
+ {
40
+
41
+
42
+ // \brief Enum describing the 16 states of the interval overlapping
43
+ // see P1788/D7.0 Sect. 9.7.2 Table 6
44
+ //
45
+ enum class overlapping_state : uint32_t
46
+ {
47
+ undefined = 0,
48
+ both_empty = 1 << 0,
49
+ first_empty = 1 << 1,
50
+ second_empty = 1 << 2,
51
+ before = 1 << 3,
52
+ meets = 1 << 4,
53
+ overlaps = 1 << 5,
54
+ starts = 1 << 6,
55
+ contained_by = 1 << 7,
56
+ finishes = 1 << 8,
57
+ equal = 1 << 9,
58
+ finished_by = 1 << 10,
59
+ contains = 1 << 11,
60
+ started_by = 1 << 12,
61
+ overlapped_by = 1 << 13,
62
+ met_by = 1 << 14,
63
+ after = 1 << 15
64
+ };
65
+
66
+
67
+ /// \brief Operator for writing an overlapping state onto an output stream.
68
+ ///
69
+ /// \param os Output stream
70
+ /// \param o Overlapping state to write onto the output stream \p os
71
+ /// \return Output stream \p os to support operator chaining
72
+ ///
73
+ /// \note The function pays attention to the output manipulators
74
+ /// \link p1788::io::overlapping_alpha(std::basic_ostream<CharT, Traits>& os) overlapping_alpha \endlink ,
75
+ /// and \link p1788::io::overlapping_numeric(std::basic_ostream<CharT, Traits>& os) overlapping_numeric \endlink
76
+ /// as well as to
77
+ /// \link p1788::io::lower_case(std::basic_ostream<CharT, Traits>& os) lower_case \endlink
78
+ /// and \link p1788::io::upper_case(std::basic_ostream<CharT, Traits>& os) upper_case \endlink .
79
+ template<typename CharT, typename Traits>
80
+ std::basic_ostream<CharT, Traits>& operator<<(
81
+ std::basic_ostream<CharT, Traits>& os, overlapping_state o)
82
+ {
83
+ // numeric
84
+ if (os.iword(p1788::io::overlapping_manip_id) == p1788::io::overlapping_numeric_representation)
85
+ {
86
+ return os << static_cast<unsigned int>(o);
87
+ }
88
+
89
+ // alphabetic
90
+ switch (o)
91
+ {
92
+ case overlapping_state::both_empty:
93
+ switch (os.iword(p1788::io::text_representation_manip_id))
94
+ {
95
+ case p1788::io::upper_case_text_representation:
96
+ return os << "BOTH_EMPTY";
97
+ default:
98
+ return os << "both_empty";
99
+ }
100
+ case overlapping_state::first_empty:
101
+ switch (os.iword(p1788::io::text_representation_manip_id))
102
+ {
103
+ case p1788::io::upper_case_text_representation:
104
+ return os << "FIRST_EMPTY";
105
+ default:
106
+ return os << "first_empty";
107
+ }
108
+ case overlapping_state::second_empty:
109
+ switch (os.iword(p1788::io::text_representation_manip_id))
110
+ {
111
+ case p1788::io::upper_case_text_representation:
112
+ return os << "SECOND_EMPTY";
113
+ default:
114
+ return os << "second_empty";
115
+ }
116
+ case overlapping_state::before:
117
+ switch (os.iword(p1788::io::text_representation_manip_id))
118
+ {
119
+ case p1788::io::upper_case_text_representation:
120
+ return os << "BEFORE";
121
+ default:
122
+ return os << "before";
123
+ }
124
+ case overlapping_state::meets:
125
+ switch (os.iword(p1788::io::text_representation_manip_id))
126
+ {
127
+ case p1788::io::upper_case_text_representation:
128
+ return os << "MEETS";
129
+ default:
130
+ return os << "meets";
131
+ }
132
+ case overlapping_state::overlaps:
133
+ switch (os.iword(p1788::io::text_representation_manip_id))
134
+ {
135
+ case p1788::io::upper_case_text_representation:
136
+ return os << "OVERLAPS";
137
+ default:
138
+ return os << "overlaps";
139
+ }
140
+ case overlapping_state::starts:
141
+ switch (os.iword(p1788::io::text_representation_manip_id))
142
+ {
143
+ case p1788::io::upper_case_text_representation:
144
+ return os << "STARTS";
145
+ default:
146
+ return os << "starts";
147
+ }
148
+ case overlapping_state::contained_by:
149
+ switch (os.iword(p1788::io::text_representation_manip_id))
150
+ {
151
+ case p1788::io::upper_case_text_representation:
152
+ return os << "CONTAINED_BY";
153
+ default:
154
+ return os << "contained_by";
155
+ }
156
+ case overlapping_state::finishes:
157
+ switch (os.iword(p1788::io::text_representation_manip_id))
158
+ {
159
+ case p1788::io::upper_case_text_representation:
160
+ return os << "FINISHES";
161
+ default:
162
+ return os << "finishes";
163
+ }
164
+ case overlapping_state::equal:
165
+ switch (os.iword(p1788::io::text_representation_manip_id))
166
+ {
167
+ case p1788::io::upper_case_text_representation:
168
+ return os << "EQUAL";
169
+ default:
170
+ return os << "equal";
171
+ }
172
+ case overlapping_state::finished_by:
173
+ switch (os.iword(p1788::io::text_representation_manip_id))
174
+ {
175
+ case p1788::io::upper_case_text_representation:
176
+ return os << "FINISHED_BY";
177
+ default:
178
+ return os << "finished_by";
179
+ }
180
+ case overlapping_state::contains:
181
+ switch (os.iword(p1788::io::text_representation_manip_id))
182
+ {
183
+ case p1788::io::upper_case_text_representation:
184
+ return os << "CONTAINS";
185
+ default:
186
+ return os << "contains";
187
+ }
188
+ case overlapping_state::started_by:
189
+ switch (os.iword(p1788::io::text_representation_manip_id))
190
+ {
191
+ case p1788::io::upper_case_text_representation:
192
+ return os << "STARTED_BY";
193
+ default:
194
+ return os << "started_by";
195
+ }
196
+ case overlapping_state::overlapped_by:
197
+ switch (os.iword(p1788::io::text_representation_manip_id))
198
+ {
199
+ case p1788::io::upper_case_text_representation:
200
+ return os << "OVERLAPPED_BY";
201
+ default:
202
+ return os << "overlapped_by";
203
+ }
204
+ case overlapping_state::met_by:
205
+ switch (os.iword(p1788::io::text_representation_manip_id))
206
+ {
207
+ case p1788::io::upper_case_text_representation:
208
+ return os << "MET_BY";
209
+ default:
210
+ return os << "met_by";
211
+ }
212
+ case overlapping_state::after:
213
+ switch (os.iword(p1788::io::text_representation_manip_id))
214
+ {
215
+ case p1788::io::upper_case_text_representation:
216
+ return os << "AFTER";
217
+ default:
218
+ return os << "after";
219
+ }
220
+ default: // undefined
221
+ switch (os.iword(p1788::io::text_representation_manip_id))
222
+ {
223
+ case p1788::io::upper_case_text_representation:
224
+ return os << "UNDEFINED";
225
+ default:
226
+ return os << "undefined";
227
+ }
228
+ }
229
+
230
+ // Something went wrong ;-)
231
+ return os;
232
+ }
233
+
234
+
235
+ } // namespace overlapping
236
+
237
+ } // namespace p1788
238
+
239
+
240
+
241
+ #endif // LIBIEEEP1788_P1788_OVERLAPPING_OVERLAPPING_HPP
@@ -0,0 +1,45 @@
1
+ //
2
+ // libieeep1788
3
+ //
4
+ // An implementation of the preliminary IEEE P1788 standard for
5
+ // interval arithmetic
6
+ //
7
+ //
8
+ // Copyright 2013 - 2015
9
+ //
10
+ // Marco Nehmeier (nehmeier@informatik.uni-wuerzburg.de)
11
+ // Department of Computer Science,
12
+ // University of Wuerzburg, Germany
13
+ //
14
+ // Licensed under the Apache License, Version 2.0 (the "License");
15
+ // you may not use this file except in compliance with the License.
16
+ // You may obtain a copy of the License at
17
+ //
18
+ // http://www.apache.org/licenses/LICENSE-2.0
19
+ //
20
+ // Unless required by applicable law or agreed to in writing, software
21
+ // distributed under the License is distributed on an "AS IS" BASIS,
22
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
+ // See the License for the specific language governing permissions and
24
+ // limitations under the License.
25
+
26
+ #ifndef LIBIEEEP1788_P1788_P1788_HPP
27
+ #define LIBIEEEP1788_P1788_P1788_HPP
28
+
29
+
30
+ #include "p1788/version.hpp"
31
+
32
+ #include "p1788/decoration/decoration.hpp"
33
+ #include "p1788/exception/exception.hpp"
34
+ #include "p1788/io/io_manip.hpp"
35
+ #include "p1788/overlapping/overlapping.hpp"
36
+
37
+ #include "p1788/infsup/interval.hpp"
38
+ #include "p1788/infsup/decorated_interval.hpp"
39
+
40
+ #include "p1788/flavor/infsup/setbased/mpfr_bin_ieee754_flavor.hpp"
41
+
42
+ #include "p1788/reduction/reduction.hpp"
43
+
44
+
45
+ #endif // LIBIEEEP1788_P1788_P1788_HPP
@@ -0,0 +1,341 @@
1
+ //
2
+ // libieeep1788
3
+ //
4
+ // An implementation of the preliminary IEEE P1788 standard for
5
+ // interval arithmetic
6
+ //
7
+ //
8
+ // Copyright 2013 - 2015
9
+ //
10
+ // Marco Nehmeier (nehmeier@informatik.uni-wuerzburg.de)
11
+ // Department of Computer Science,
12
+ // University of Wuerzburg, Germany
13
+ //
14
+ // Licensed under the Apache License, Version 2.0 (the "License");
15
+ // you may not use this file except in compliance with the License.
16
+ // You may obtain a copy of the License at
17
+ //
18
+ // http://www.apache.org/licenses/LICENSE-2.0
19
+ //
20
+ // Unless required by applicable law or agreed to in writing, software
21
+ // distributed under the License is distributed on an "AS IS" BASIS,
22
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
+ // See the License for the specific language governing permissions and
24
+ // limitations under the License.
25
+
26
+
27
+ #ifndef LIBIEEEP1788_P1788_REDUCTION_REDUCTION_HPP
28
+ #define LIBIEEEP1788_P1788_REDUCTION_REDUCTION_HPP
29
+
30
+ #include <iterator>
31
+ #include <initializer_list>
32
+
33
+ #include "p1788/util/mpfr_var.hpp"
34
+
35
+ namespace p1788
36
+ {
37
+
38
+ namespace reduction
39
+ {
40
+
41
+
42
+ // enum for rounding modes
43
+ enum class rnd_mode
44
+ {
45
+ downward = MPFR_RNDD,
46
+ upward = MPFR_RNDU,
47
+ to_nearest = MPFR_RNDN,
48
+ to_zero = MPFR_RNDZ
49
+ };
50
+
51
+ // convert rnd_mode to mpfr rndmode
52
+ inline mpfr_rnd_t get_mpfr_rnd_mode(rnd_mode rnd)
53
+ {
54
+ switch (rnd)
55
+ {
56
+ case rnd_mode::downward:
57
+ return MPFR_RNDD;
58
+ case rnd_mode::upward:
59
+ return MPFR_RNDU;
60
+ case rnd_mode::to_nearest:
61
+ return MPFR_RNDN;
62
+ case rnd_mode::to_zero:
63
+ return MPFR_RNDZ;
64
+ }
65
+
66
+ // Something went wrong
67
+ return MPFR_RNDN;
68
+ }
69
+
70
+
71
+
72
+ // class to perform the accumulation with a combined memory handling (RAII)
73
+ template<class Iter>
74
+ class reduction_sum_op
75
+ {
76
+ static_assert(std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::is_iec559,
77
+ "Only IEEE 754 binary compliant types are supported!");
78
+
79
+ // Typedef for the corresponding mpfr wrapper class representing the IEEE 754 binary floating point format of the iterator value type
80
+ typedef p1788::util::mpfr_var<
81
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits,
82
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm != std::denorm_present
83
+ ? std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent
84
+ : std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent - std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits + 1,
85
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::max_exponent,
86
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm == std::denorm_present
87
+ > mpfr_var;
88
+
89
+ public:
90
+
91
+ // perform op on one iterator
92
+ reduction_sum_op(void (*op) (Iter, mpfr_ptr*), Iter begin, Iter end, rnd_mode rnd) : n_(end - begin)
93
+ {
94
+ mpfr_var::setup();
95
+ tab_ = new mpfr_ptr[n_]; // array of elemets
96
+
97
+ mpfr_ptr* p = tab_;
98
+
99
+ // perform op on iterator
100
+ while (begin != end)
101
+ op(begin++, p++);
102
+
103
+ mpfr_var res;
104
+
105
+ // accumulate
106
+ res.subnormalize(mpfr_sum(res(), tab_, n_, get_mpfr_rnd_mode(rnd)), get_mpfr_rnd_mode(rnd));
107
+
108
+ // get result
109
+ result_ = res.template get<typename std::iterator_traits<Iter>::value_type>(get_mpfr_rnd_mode(rnd));
110
+
111
+ if (result_ == 0.0)
112
+ result_ = rnd == rnd_mode::downward ? -0.0 : 0.0;
113
+ }
114
+
115
+ // perform op on two interators
116
+ reduction_sum_op(void (*op) (Iter, Iter, mpfr_ptr*), Iter begin_a, Iter end_a, Iter begin_b, rnd_mode rnd) : n_(end_a - begin_a)
117
+ {
118
+ mpfr_var::setup();
119
+ tab_ = new mpfr_ptr[n_]; // array of elemets
120
+
121
+ mpfr_ptr* p = tab_;
122
+
123
+ // perform op on iterator
124
+ while (begin_a != end_a)
125
+ op(begin_a++, begin_b++, p++);
126
+
127
+ mpfr_var res;
128
+
129
+ // accumulate
130
+ res.subnormalize(mpfr_sum(res(), tab_, n_, get_mpfr_rnd_mode(rnd)), get_mpfr_rnd_mode(rnd));
131
+
132
+ // get result
133
+ result_ = res.template get<typename std::iterator_traits<Iter>::value_type>(get_mpfr_rnd_mode(rnd));
134
+
135
+ if (result_ == 0.0)
136
+ result_ = rnd == rnd_mode::downward ? -0.0 : 0.0;
137
+ }
138
+
139
+ // cleanup
140
+ ~reduction_sum_op()
141
+ {
142
+ for(mpfr_ptr* b = tab_; b != tab_ + n_; ++b)
143
+ mpfr_clear(*b);
144
+
145
+ delete[] tab_;
146
+
147
+ }
148
+
149
+ // get result
150
+ typename std::iterator_traits<Iter>::value_type
151
+ result()
152
+ {
153
+ return result_;
154
+ }
155
+
156
+ private:
157
+ size_t const n_;
158
+ typename std::iterator_traits<Iter>::value_type result_;
159
+ mpfr_ptr* tab_;
160
+ };
161
+
162
+
163
+
164
+
165
+ // sum
166
+ template<class Iter>
167
+ typename std::iterator_traits<Iter>::value_type
168
+ inline sum(Iter begin, Iter end, rnd_mode rnd)
169
+ {
170
+ // Typedef for the corresponding mpfr wrapper class representing the IEEE 754 binary floating point format of the iterator value type
171
+ typedef p1788::util::mpfr_var<
172
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits,
173
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm != std::denorm_present
174
+ ? std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent
175
+ : std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent - std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits + 1,
176
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::max_exponent,
177
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm == std::denorm_present
178
+ > mpfr_var;
179
+
180
+ reduction_sum_op<Iter> op(
181
+ [] (Iter i, mpfr_ptr* p)
182
+ {
183
+ *p = new mpfr_t;
184
+
185
+ mpfr_init2(*p, std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits);
186
+
187
+ mpfr_var tmp(*i, MPFR_RNDN);
188
+
189
+ mpfr_set(*p, tmp(), MPFR_RNDN);
190
+ },
191
+ begin, end, rnd
192
+ );
193
+
194
+ return op.result();
195
+ }
196
+
197
+ // sum
198
+ template<typename T>
199
+ T
200
+ inline sum(std::initializer_list<T> l, rnd_mode rnd)
201
+ {
202
+ return sum(std::begin(l), std::end(l), rnd);
203
+ }
204
+
205
+
206
+ // sum_abs
207
+ template<class Iter>
208
+ typename std::iterator_traits<Iter>::value_type
209
+ inline sum_abs(Iter begin, Iter end, rnd_mode rnd)
210
+ {
211
+ // Typedef for the corresponding mpfr wrapper class representing the IEEE 754 binary floating point format of the iterator value type
212
+ typedef p1788::util::mpfr_var<
213
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits,
214
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm != std::denorm_present
215
+ ? std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent
216
+ : std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent - std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits + 1,
217
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::max_exponent,
218
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm == std::denorm_present
219
+ > mpfr_var;
220
+
221
+ reduction_sum_op<Iter> op(
222
+ [] (Iter i, mpfr_ptr* p)
223
+ {
224
+ *p = new mpfr_t;
225
+
226
+ mpfr_init2(*p, std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits);
227
+
228
+ mpfr_var tmp(*i, MPFR_RNDN);
229
+ mpfr_abs(tmp(), tmp(), MPFR_RNDN);
230
+
231
+ mpfr_set(*p, tmp(), MPFR_RNDN);
232
+ },
233
+ begin, end, rnd
234
+ );
235
+
236
+ return op.result();
237
+ }
238
+
239
+ // sum_abs
240
+ template<typename T>
241
+ T
242
+ inline sum_abs(std::initializer_list<T> l, rnd_mode rnd)
243
+ {
244
+ return sum_abs(std::begin(l), std::end(l), rnd);
245
+ }
246
+
247
+
248
+ // sum_sqr
249
+ template<class Iter>
250
+ typename std::iterator_traits<Iter>::value_type
251
+ inline sum_sqr(Iter begin, Iter end, rnd_mode rnd)
252
+ {
253
+ // Typedef for the corresponding mpfr wrapper class representing the IEEE 754 binary floating point format of the iterator value type with twice the mantissa size
254
+ typedef p1788::util::mpfr_var<
255
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits * 2,
256
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm != std::denorm_present
257
+ ? std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent
258
+ : std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent - std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits * 2 + 1,
259
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::max_exponent,
260
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm == std::denorm_present
261
+ > mpfr_var;
262
+
263
+ reduction_sum_op<Iter> op(
264
+ [] (Iter i, mpfr_ptr* p)
265
+ {
266
+ *p = new mpfr_t;
267
+
268
+ mpfr_init2(*p, std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits * 2);
269
+
270
+ mpfr_var tmp(*i, MPFR_RNDN);
271
+ mpfr_sqr(tmp(), tmp(), MPFR_RNDN);
272
+
273
+ mpfr_set(*p, tmp(), MPFR_RNDN);
274
+ },
275
+ begin, end, rnd
276
+ );
277
+
278
+ return op.result();
279
+ }
280
+
281
+ // sum_sqr
282
+ template<typename T>
283
+ T
284
+ inline sum_sqr(std::initializer_list<T> l, rnd_mode rnd)
285
+ {
286
+ return sum_sqr(std::begin(l), std::end(l), rnd);
287
+ }
288
+
289
+
290
+ // dot
291
+ template<class Iter>
292
+ typename std::iterator_traits<Iter>::value_type
293
+ inline dot(Iter begin_a, Iter end_a, Iter begin_b, rnd_mode rnd)
294
+ {
295
+ // Typedef for the corresponding mpfr wrapper class representing the IEEE 754 binary floating point format of the iterator value type with twice the mantissa size
296
+ typedef p1788::util::mpfr_var<
297
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits * 2,
298
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm != std::denorm_present
299
+ ? std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent
300
+ : std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::min_exponent - std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits * 2 + 1,
301
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::max_exponent,
302
+ std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::has_denorm == std::denorm_present
303
+ > mpfr_var;
304
+
305
+ reduction_sum_op<Iter> op(
306
+ [] (Iter a, Iter b, mpfr_ptr* p)
307
+ {
308
+ *p = new mpfr_t;
309
+
310
+ mpfr_init2(*p, std::numeric_limits<typename std::iterator_traits<Iter>::value_type>::digits * 2);
311
+
312
+ mpfr_var tmp_a(*a, MPFR_RNDN);
313
+ mpfr_var tmp_b(*b, MPFR_RNDN);
314
+
315
+ mpfr_mul(tmp_a(), tmp_a(), tmp_b(), MPFR_RNDN);
316
+
317
+ mpfr_set(*p, tmp_a(), MPFR_RNDN);
318
+ },
319
+ begin_a, end_a, begin_b, rnd
320
+ );
321
+
322
+ return op.result();
323
+ }
324
+
325
+ // dot
326
+ template<typename T>
327
+ T
328
+ inline dot(std::initializer_list<T> a, std::initializer_list<T> b, rnd_mode rnd)
329
+ {
330
+ return dot(std::begin(a), std::end(a), std::begin(b), rnd);
331
+ }
332
+
333
+
334
+
335
+ } // namespace reduction
336
+
337
+ } // namespace p1788
338
+
339
+
340
+
341
+ #endif // LIBIEEEP1788_P1788_REDUCTION_REDUCTION_HPP
@@ -0,0 +1,63 @@
1
+ // An implementation of the preliminary IEEE P1788 standard for
2
+ // interval arithmetic
3
+ //
4
+ //
5
+ // Copyright 2013 - 2015
6
+ //
7
+ // Marco Nehmeier (nehmeier@informatik.uni-wuerzburg.de)
8
+ // Department of Computer Science,
9
+ // University of Wuerzburg, Germany
10
+ //
11
+ // Licensed under the Apache License, Version 2.0 (the "License");
12
+ // you may not use this file except in compliance with the License.
13
+ // You may obtain a copy of the License at
14
+ //
15
+ // http://www.apache.org/licenses/LICENSE-2.0
16
+ //
17
+ // Unless required by applicable law or agreed to in writing, software
18
+ // distributed under the License is distributed on an "AS IS" BASIS,
19
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ // See the License for the specific language governing permissions and
21
+ // limitations under the License.
22
+
23
+ #ifndef LIBIEEEP1788_P1788_UTIL_IO_HPP
24
+ #define LIBIEEEP1788_P1788_UTIL_IO_HPP
25
+
26
+ #include <iostream>
27
+ #include <cctype>
28
+ #include <ctype.h>
29
+ #include <string>
30
+ #include <algorithm>
31
+
32
+ namespace p1788
33
+ {
34
+
35
+ namespace util
36
+ {
37
+
38
+ // Remove whitespace character from input stream
39
+ template<typename CharT, typename Traits>
40
+ inline void remove_ws(std::basic_istream<CharT, Traits>& is)
41
+ {
42
+ while (is && std::isspace(is.peek()))
43
+ is.get();
44
+
45
+ }
46
+
47
+
48
+ // transform all ASCII characters to lowercase
49
+ inline void ascii_to_lower(std::string& s)
50
+ {
51
+ std::transform(s.begin(), s.end(), s.begin(),
52
+ [](int const c)
53
+ {
54
+ return (c >= 0 && c < 128 ) ? std::tolower(c) : c;
55
+ }
56
+ );
57
+ }
58
+
59
+ } // namespace util
60
+
61
+ } // namespace p1788
62
+
63
+ #endif // LIBIEEEP1788_P1788_UTIL_IO_HPP