diff --git a/src/interval/interval_def.h b/src/interval/interval_def.h index 050c69589d..a2f995a11c 100644 --- a/src/interval/interval_def.h +++ b/src/interval/interval_def.h @@ -1242,7 +1242,39 @@ template void interval::tanh () { lean_assert(check_invariant()); return; } -template void interval::asinh() { /* TODO */ lean_unreachable(); return; } -template void interval::acosh() { /* TODO */ lean_unreachable(); return; } -template void interval::atanh() { /* TODO */ lean_unreachable(); return; } +template void interval::asinh() { + if(lower_kind() == XN_NUMERAL) { + numeric_traits::set_rounding(false); + numeric_traits::asinh(m_lower); + } + if(upper_kind() == XN_NUMERAL) { + numeric_traits::set_rounding(true); + numeric_traits::asinh(m_upper); + } + lean_assert(check_invariant()); + return; +} +template void interval::acosh() { + lean_assert(lower_kind() == XN_NUMERAL && m_lower >= 1.0); + numeric_traits::set_rounding(false); + numeric_traits::acosh(m_lower); + if(upper_kind() == XN_NUMERAL) { + numeric_traits::set_rounding(true); + numeric_traits::acosh(m_lower); + } + lean_assert(check_invariant()); + return; +} +template void interval::atanh() { + if(lower_kind() == XN_NUMERAL) { + numeric_traits::set_rounding(false); + numeric_traits::atanh(m_lower); + } + if(upper_kind() == XN_NUMERAL) { + numeric_traits::set_rounding(true); + numeric_traits::atanh(m_upper); + } + lean_assert(check_invariant()); + return; +} }