@@ -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