DEC_TYPE INTERNAL_FUNCTION_NAME (DEC_TYPE x) { decContext context; decNumber dn_result; DEC_TYPE result, one; decNumber dn_x, dn_one; one = DFP_CONSTANT(1.0); FUNC_CONVERT_TO_DN (&one, &dn_one); FUNC_CONVERT_TO_DN (&x, &dn_x); if (decNumberIsNaN (&dn_x) || decNumberIsZero (&dn_x) || decNumberIsInfinite (&dn_x)) { return x + x; } decContextDefault (&context, DEFAULT_CONTEXT); /* using trig identity: acosh(x) = log(x+sqrt(x*x-1)) */ decNumberMultiply (&dn_result, &dn_x, &dn_x, &context); decNumberAdd (&dn_result, &dn_result, &dn_one, &context); decNumberSquareRoot (&dn_result, &dn_result, &context); decNumberAdd (&dn_result, &dn_result, &dn_x, &context); decNumberLn (&dn_result, &dn_result, &context); FUNC_CONVERT_FROM_DN (&dn_result, &result, &context); return result; }
void* decSingleSquareRoot (void* _0, const void* _1, decContext* ctx) noexcept { decNumber _0num; decNumber _1num; decSingleToNumber (_1, &_1num); decNumberSquareRoot (&_0num, &_1num, ctx); return decSingleFromNumber (_0, &_0num, ctx); }
DecimalDecNumber sqrt(const DecimalDecNumber &val) { DecimalDecNumber result; decNumberSquareRoot(&result.m_value, &val.m_value, &val.m_context); return result; }