93 #ifndef GEOS_MATH_DD_H
94 #define GEOS_MATH_DD_H
110 static constexpr
double SPLIT = 134217729.0;
114 int magnitude(
double x)
const;
120 DD(
double p_hi,
double p_lo) : hi(p_hi), lo(p_lo) {};
121 DD(
double x) : hi(x), lo(0.0) {};
122 DD(
const DD &dd) : hi(dd.hi), lo(dd.lo) {};
123 DD() : hi(0.0), lo(0.0) {};
127 return hi == rhs.hi && lo == rhs.lo;
132 return hi != rhs.hi || lo != rhs.lo;
135 bool operator<(
const DD &rhs)
const
137 return (hi < rhs.hi) || (hi == rhs.hi && lo < rhs.lo);
140 bool operator<=(
const DD &rhs)
const
142 return (hi < rhs.hi) || (hi == rhs.hi && lo <= rhs.lo);
145 bool operator>(
const DD &rhs)
const
147 return (hi > rhs.hi) || (hi == rhs.hi && lo > rhs.lo);
150 bool operator>=(
const DD &rhs)
const
152 return (hi > rhs.hi) || (hi == rhs.hi && lo >= rhs.lo);
155 friend DD operator+ (
const DD &lhs,
const DD &rhs);
156 friend DD operator+ (
const DD &lhs,
double rhs);
157 friend DD operator- (
const DD &lhs,
const DD &rhs);
158 friend DD operator- (
const DD &lhs,
double rhs);
159 friend DD operator* (
const DD &lhs,
const DD &rhs);
160 friend DD operator* (
const DD &lhs,
double rhs);
161 friend DD operator/ (
const DD &lhs,
const DD &rhs);
162 friend DD operator/ (
const DD &lhs,
double rhs);
164 static DD determinant(
const DD &x1,
const DD &y1,
const DD &x2,
const DD &y2);
165 static DD determinant(
double x1,
double y1,
double x2,
double y2);
166 static DD abs(
const DD &d);
167 static DD pow(
const DD &d,
int exp);
168 static DD trunc(
const DD &d);
171 bool isNegative()
const;
172 bool isPositive()
const;
174 double doubleValue()
const;
175 double ToDouble()
const {
return doubleValue(); }
176 int intValue()
const;
178 DD reciprocal()
const;
182 void selfAdd(
const DD &d);
183 void selfAdd(
double p_hi,
double p_lo);
184 void selfAdd(
double y);
186 void selfSubtract(
const DD &d);
187 void selfSubtract(
double p_hi,
double p_lo);
188 void selfSubtract(
double y);
190 void selfMultiply(
double p_hi,
double p_lo);
191 void selfMultiply(
const DD &d);
192 void selfMultiply(
double y);
194 void selfDivide(
double p_hi,
double p_lo);
195 void selfDivide(
const DD &d);
196 void selfDivide(
double y);
204 #endif // GEOS_MATH_DD_H