GEOS 3.14.0dev
DD.h
1/**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2020 Crunchy Data
7 *
8 * This is free software; you can redistribute and/or modify it under
9 * the terms of the GNU Lesser General Public Licence as published
10 * by the Free Software Foundation.
11 * See the COPYING file for more information.
12 *
13 **********************************************************************/
14
93#pragma once
94
95#include <cmath>
96#include <geos/export.h>
97
98namespace geos {
99namespace math { // geos.math
100
108class GEOS_DLL DD {
109 private:
110 static constexpr double SPLIT = 134217729.0; // 2^27+1, for IEEE double
111 double hi;
112 double lo;
113
114 int signum() const;
115 DD rint() const;
116
117
118 public:
119 DD(double p_hi, double p_lo) : hi(p_hi), lo(p_lo) {};
120 DD(double x) : hi(x), lo(0.0) {};
121 DD() : hi(0.0), lo(0.0) {};
122
123 bool operator==(const DD &rhs) const
124 {
125 return hi == rhs.hi && lo == rhs.lo;
126 }
127
128 bool operator!=(const DD &rhs) const
129 {
130 return hi != rhs.hi || lo != rhs.lo;
131 }
132
133 bool operator<(const DD &rhs) const
134 {
135 return (hi < rhs.hi) || (hi == rhs.hi && lo < rhs.lo);
136 }
137
138 bool operator<=(const DD &rhs) const
139 {
140 return (hi < rhs.hi) || (hi == rhs.hi && lo <= rhs.lo);
141 }
142
143 bool operator>(const DD &rhs) const
144 {
145 return (hi > rhs.hi) || (hi == rhs.hi && lo > rhs.lo);
146 }
147
148 bool operator>=(const DD &rhs) const
149 {
150 return (hi > rhs.hi) || (hi == rhs.hi && lo >= rhs.lo);
151 }
152
153 friend GEOS_DLL DD operator+ (const DD &lhs, const DD &rhs);
154 friend GEOS_DLL DD operator+ (const DD &lhs, double rhs);
155 friend GEOS_DLL DD operator- (const DD &lhs, const DD &rhs);
156 friend GEOS_DLL DD operator- (const DD &lhs, double rhs);
157 friend GEOS_DLL DD operator* (const DD &lhs, const DD &rhs);
158 friend GEOS_DLL DD operator* (const DD &lhs, double rhs);
159 friend GEOS_DLL DD operator/ (const DD &lhs, const DD &rhs);
160 friend GEOS_DLL DD operator/ (const DD &lhs, double rhs);
161
162 static DD determinant(const DD &x1, const DD &y1, const DD &x2, const DD &y2);
163 static DD determinant(double x1, double y1, double x2, double y2);
164 static DD abs(const DD &d);
165 static DD pow(const DD &d, int exp);
166 static DD trunc(const DD &d);
167
168 bool isNaN() const;
169 bool isNegative() const;
170 bool isPositive() const;
171 bool isZero() const;
172 double doubleValue() const;
173 double ToDouble() const { return doubleValue(); }
174 int intValue() const;
175 DD negate() const;
176 DD reciprocal() const;
177 DD floor() const;
178 DD ceil() const;
179
180 void selfAdd(const DD &d);
181 void selfAdd(double p_hi, double p_lo);
182 void selfAdd(double y);
183
184 void selfSubtract(const DD &d);
185 void selfSubtract(double p_hi, double p_lo);
186 void selfSubtract(double y);
187
188 void selfMultiply(double p_hi, double p_lo);
189 void selfMultiply(const DD &d);
190 void selfMultiply(double y);
191
192 void selfDivide(double p_hi, double p_lo);
193 void selfDivide(const DD &d);
194 void selfDivide(double y);
195};
196
197
198} // namespace geos::math
199} // namespace geos
200
Wrapper for DoubleDouble higher precision mathematics operations.
Definition DD.h:108
Basic namespace for all GEOS functionalities.
Definition geos.h:39