17db96d56Sopenharmony_ci/* log1p(x) = log(1+x).  The log1p function is designed to avoid the
27db96d56Sopenharmony_ci   significant loss of precision that arises from direct evaluation when x is
37db96d56Sopenharmony_ci   small. Use the substitute from _math.h on all platforms: it includes
47db96d56Sopenharmony_ci   workarounds for buggy handling of zeros.
57db96d56Sopenharmony_ci */
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_cistatic double
87db96d56Sopenharmony_ci_Py_log1p(double x)
97db96d56Sopenharmony_ci{
107db96d56Sopenharmony_ci    /* Some platforms supply a log1p function but don't respect the sign of
117db96d56Sopenharmony_ci       zero:  log1p(-0.0) gives 0.0 instead of the correct result of -0.0.
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci       To save fiddling with configure tests and platform checks, we handle the
147db96d56Sopenharmony_ci       special case of zero input directly on all platforms.
157db96d56Sopenharmony_ci    */
167db96d56Sopenharmony_ci    if (x == 0.0) {
177db96d56Sopenharmony_ci        return x;
187db96d56Sopenharmony_ci    }
197db96d56Sopenharmony_ci    else {
207db96d56Sopenharmony_ci        return log1p(x);
217db96d56Sopenharmony_ci    }
227db96d56Sopenharmony_ci}
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci#define m_log1p _Py_log1p
25