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