In /usr/include/__math.h the function asinh fails for negative arguments because __sgn1 is called before log1p. The statement should be "return log1p (__y *__y / (sqrt(__y * __y + 1.0) + 1.0) + __y) * __sgn1(__x);" A more general problem with this file (or maybe it is the compiler) is that when function arguments are given as long double type, they get converted to temporary variables of double type and then those are loaded onto the FPU. This can cause loss of precision and overflow.