Skip to content

Commit 7dca0bd

Browse files
committed
QPR-11265 optimize close_enough (this is ql mr 1494)
1 parent 49108fc commit 7dca0bd

1 file changed

Lines changed: 26 additions & 4 deletions

File tree

ql/math/comparison.hpp

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,18 @@ namespace QuantLib {
5757
// inline definitions
5858

5959
inline bool close(Real x, Real y) {
60-
return close(x,y,42);
60+
// Deals with +infinity and -infinity representations etc.
61+
if (x == y)
62+
return true;
63+
64+
Real diff = std::fabs(x-y);
65+
constexpr Real tolerance = 42 * QL_EPSILON;
66+
67+
if (x == 0.0 || y == 0.0)
68+
return diff < (tolerance * tolerance);
69+
70+
return diff <= tolerance*std::fabs(x) &&
71+
diff <= tolerance*std::fabs(y);
6172
}
6273

6374
inline bool close(Real x, Real y, Size n) {
@@ -67,15 +78,26 @@ namespace QuantLib {
6778

6879
Real diff = std::fabs(x-y), tolerance = n * QL_EPSILON;
6980

70-
if (x * y == 0.0) // x or y = 0.0
81+
if (x == 0.0 || y == 0.0)
7182
return diff < (tolerance * tolerance);
7283

7384
return diff <= tolerance*std::fabs(x) &&
7485
diff <= tolerance*std::fabs(y);
7586
}
7687

7788
inline bool close_enough(Real x, Real y) {
78-
return close_enough(x,y,42);
89+
// Deals with +infinity and -infinity representations etc.
90+
if (x == y)
91+
return true;
92+
93+
Real diff = std::fabs(x-y);
94+
constexpr Real tolerance = 42 * QL_EPSILON;
95+
96+
if (x == 0.0 || y == 0.0) // x or y = 0.0
97+
return diff < (tolerance * tolerance);
98+
99+
return diff <= tolerance*std::fabs(x) ||
100+
diff <= tolerance*std::fabs(y);
79101
}
80102

81103
inline bool close_enough(Real x, Real y, Size n) {
@@ -85,7 +107,7 @@ namespace QuantLib {
85107

86108
Real diff = std::fabs(x-y), tolerance = n * QL_EPSILON;
87109

88-
if (x * y == 0.0) // x or y = 0.0
110+
if (x == 0.0 || y == 0.0)
89111
return diff < (tolerance * tolerance);
90112

91113
return diff <= tolerance*std::fabs(x) ||

0 commit comments

Comments
 (0)