{
  "category": "Math and trigonometry functions",
  "display_name": "ACOSH",
  "entry_kind": "built_in_function",
  "eval_api": {
    "method": "POST",
    "url": "https://handbook.dnacalc.com/api/eval"
  },
  "function_id": "FUNC.ACOSH",
  "implementation_state": {
    "answer_bank": {
      "excel_builds": [
        "20430"
      ],
      "larger_numeric": 0,
      "last_bit": 0,
      "matched": 5730,
      "other_mismatch": 0,
      "refused": 0,
      "rows": 5730,
      "unread": 0,
      "worst_ulp": 0
    },
    "detail": "Recorded: 5,730 in the answer bank and 3 workbook cells.",
    "dnacalc_commit": "9e1884369a678158dd82d3d74188daf986995e87",
    "in_catalogue": true,
    "state": "matches",
    "state_label": "Matches every recorded Excel answer",
    "summary": "Matches all 5,733 recorded answers",
    "workbook_corpus": {
      "cells": 3,
      "matched": 3
    }
  },
  "implementations": [
    {
      "commit": "9e1884369a678158dd82d3d74188daf986995e87",
      "flavour": "excel-compatibility-candidate",
      "language": "Rust",
      "name": "CalcFunc",
      "own_code": [
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/math.rs#L45-L45",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/ported/acosh.rs#L3-L16"
      ],
      "repository": "https://github.com/DnaCalc/DnaCalc",
      "shared_code": [
        "catalogue/math::unary"
      ],
      "source": "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/math.rs#L45-L45",
      "state": "matches",
      "suite": null,
      "summary": "Matches all 5,733 recorded answers"
    }
  ],
  "json_url": "https://handbook.dnacalc.com/api/functions/FUNC.ACOSH.json",
  "name": "ACOSH",
  "notes": [],
  "schema": "efh.function-reference/v1",
  "section_order": [
    "what-it-does",
    "try-it",
    "quirks",
    "how-to-implement",
    "version-differences",
    "alternatives"
  ],
  "sections": {
    "alternatives": "\n### Relationships\n\n- **`COSH`** — the forward function. `ACOSH(COSH(t)) = |t|`; the absolute value is the branch\n  choice made visible, and it is the part of the round trip the documentation omits.\n- **`ATANH`** — the third inverse hyperbolic primary, defined on `(-1, 1)`. Between them the three\n  cover `(-1,1)`, `R`, and `[1,infinity)`; `ACOSH` and `ATANH` have complementary domains that meet\n  only at `±1`, where `ATANH` has poles and `ACOSH` a branch point.\n- **`ACOTH`** — defined on `|x| > 1`, so it shares `ACOSH`'s exclusion of the unit interval but on\n  both sides.\n- **`ACOS`** — the circular namesake, and the complementary domain: `[-1, 1]` versus\n  `[1, infinity)`. Both vanish at `x = 1` and both have a square-root approach to it. They are\n  genuinely two halves of one complex function restricted to the real axis.\n- **`LN`** and **`SQRT`** — the substrate of every closed-form evaluation, and the source of both\n  hazards.\n- **Confused with**: `ACOS`, by name; and with `1/COSH`, by readers expecting the \"inverse\" in\n  \"inverse hyperbolic cosine\" to mean a reciprocal. It does not — `SECH` is the reciprocal.\n\n\n",
    "how-to-implement": "\n### Numerical notes\n\n\nThe closed form `ln(x + sqrt(x^2 - 1))` is correct mathematics and, evaluated literally, a poor\nprogram. It fails at both ends of the domain, in different ways, and both failures have standard\nremedies.\n\n**Failure one: cancellation at the left endpoint.** For `x` just above `1`, `x^2 - 1` is a\nsubtraction of two nearly equal numbers. Worse, `x^2` has already rounded, so bits are lost before\nthe subtraction even happens. The correct answer near `1` is `sqrt(2t)` with `t = x - 1`; the naive\nform computes a square root of a quantity that has lost roughly half its significant digits, so\nthe result loses about half of its own. The remedy is to factor:\n\n    x^2 - 1 = (x - 1)(x + 1) = t(t + 2)\n\nand to write the whole thing through `log1p`:\n\n    acosh(1 + t) = log1p( t + sqrt(t*(t + 2)) )\n\nHere `1 + t` is never formed, `t` is exact when `x` is a double near `1` (Sterbenz), and the\nlogarithm's own near-one cancellation is handled by `log1p` rather than by `ln`. Both remedies —\nfactoring the difference of squares and using `log1p` — are needed; either alone leaves half the\nproblem in place. Higham's discussion of `log(1+x)` is the standard statement of the second half.\n\n**Failure two: overflow in the intermediate at the right end.** The literal form squares `x`\nfirst. `x^2` overflows binary64 once `x` exceeds about `1.34e154` — the square root of the largest\nfinite double — while the true `acosh(x)` at that point is a perfectly ordinary number near 355,\nand stays finite and small all the way to the top of the double range. So the naive form has an\nentire band of arguments, spanning more than half of the exponent range, on which the mathematics\nis representable and the program is not. The remedy is a branch: for `x` large enough that\n`x^2 - 1` would round to `x^2` anyway,\n\n    acosh(x) = ln(x) + ln(2)\n\nevaluated without ever forming `x^2`. `fdlibm`'s `e_acosh.c` implements exactly this\nthree-branch structure — `log1p` form near `1`, the closed form in the middle, `ln(2x)` at the\ntop — and it is the shape any careful implementation converges on.\n\n**Where the branches go.** The conventional cut points are `x < 2` for the `log1p` branch and\n`x > 2^28` (or thereabouts) for the `ln(2x)` branch, with the closed form in between. The exact\nchoices differ between libraries, and the residual profile of an implementation against a\nhigh-precision reference makes them visible as steps — which is precisely how upstream\nidentification work has read other surfaces in this family.\n\n**What this page does not claim.** Nothing above says what Excel computes. `ASINH`'s substrate has\nbeen identified upstream as the literal `ln(x + sqrt(x^2+1))` — see that page and its evidence\nrecord — which makes the same question live for `ACOSH`; but no identification for `ACOSH` exists\nin the Handbook's record, and the two functions could easily be implemented by different code.\n\n**A self-test that needs no oracle.** `ACOSH(COSH(t))` should return `|t|`. Run it across `t` from\nsubnormal to about 710. Where it stops round-tripping, and how it fails there, distinguishes the\nbranch structures described above without any external reference.\n\n\n",
    "quirks": "\n### Result and edge cases\n\n\nReturns `Number`.\n\n- **`x = 1`** is in the domain and returns zero. The interval is closed on the left; an\n  implementation testing `x > 1` gets the branch point wrong.\n- **Just below 1** — one ulp under — is a domain failure. This is a real hazard because the\n  natural producer of `ACOSH` arguments is a ratio that should be at least one and, after\n  rounding, sometimes is not.\n- **Just above 1** is where the square-root singularity lives, and where a naive implementation\n  loses half its significant digits. See the numerical notes.\n- **Very large arguments** are all admissible: the mathematical result stays finite and small\n  right up to the largest finite double. Whether an implementation *delivers* it there is the\n  interesting question, because the naive closed form squares the argument first.\n- **Arrays** lift elementwise, with out-of-domain elements producing element-local errors.\n\n",
    "sources": "- Microsoft Learn, \"WorksheetFunction.Acosh method (Excel)\" —\n  <https://learn.microsoft.com/en-us/office/vba/api/excel.worksheetfunction.acosh> (retrieved: the\n  description, the \"equal to or greater than 1\" argument constraint, and the round-trip statement).\n- Abramowitz & Stegun, *Handbook of Mathematical Functions*, chapter 4 section 4.6 — the\n  logarithmic closed forms for the inverse hyperbolic functions and their principal branches.\n- `fdlibm` `e_acosh.c` — the published three-branch reference implementation.\n- Higham, *Accuracy and Stability of Numerical Algorithms*, chapter 1 — the `log(1+x)` problem and\n  its remedy.\n- Handbook projections `data/functions/FUNC.ACOSH.json` (arity, lift profile, and the\n  `real_result_policy` value `non_finite=allow`) and `data/presence/FUNC.ACOSH.json` (implementing\n  module, the `BUG-FUNC-027` sweep mention, and zero entries in the discrepancy and math-deviation\n  catalogues).\n- Handbook [The value universe](../model/01-value-universe.md) — why a non-finite value cannot be\n  a published formula result — and\n  [Coercion and lifting](../model/02-coercion-and-lifting.md).\n- Handbook page [ASINH](FUNC.ASINH.md) — the sibling whose overflow substrate *is* on record, and\n  the reason the same question is live here.\n\n",
    "version-differences": "The recorded environments below distinguish a reading from a same-input comparison. Counts describe captured inputs in each environment; overlapping captures and comparisons are not totals of unique worksheet calls.\n\n| Excel 16.0 build | Platform and CPU | Captured inputs |\n|---|---|---:|\n| 19929 | Windows, bitness not recorded, CPU not recorded | 27 |\n| 20430 | Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics | 3,006 |\n| 20430 | Windows, 64-bit, CPU not recorded | 1,224 |\n\n- XC-ACOSH-001: build 19929 versus build 20430; 1 same-input pairs, 0 differing answers. Compared axes: excel-build. Numeric answers were compared by their recorded binary64 bits; other answers by typed value.\n- XC-ACOSH-002: build 19929 versus build 20430; 1 same-input pairs, 0 differing answers. Compared axes: excel-build. Numeric answers were compared by their recorded binary64 bits; other answers by typed value.\n\nAgreement on these compared inputs does not establish agreement on unmeasured inputs.\n\n[Recorded environments and comparison details](https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.ACOSH.json).",
    "what-it-does": "\n`ACOSH(number)` is the inverse hyperbolic cosine: the non-negative value whose hyperbolic cosine\nis *number*.\n\n    acosh x  =  ln( x + sqrt(x^2 - 1) ),    x >= 1\n\n- **Domain**: `[1, +infinity)`. `cosh` maps `R` onto `[1, +infinity)` and is two-to-one, so the\n  inverse requires a branch choice; the principal branch takes the non-negative one. Below `1`\n  there is no real value at all — `cosh` never goes there.\n- **Range**: `[0, +infinity)`. `acosh(1) = 0` is the branch point.\n- **Not odd, not even**: the function is defined only on a half-line, so parity is not available.\n  This is the structural difference from `ASINH` and `ATANH`, both of which are odd on symmetric\n  domains, and it is why `ACOSH` is the awkward member of the trio.\n- **Derivative**: `d/dx acosh x = 1 / sqrt(x^2 - 1)`, which is infinite at `x = 1` and decays like\n  `1/x`. Vertical tangent at the left endpoint; logarithmic flattening at the right.\n- **Endpoint behaviour**: with `x = 1 + t`,\n  `acosh(1 + t) = sqrt(2t) * (1 - t/12 + 3t^2/160 - ...)`. The same square-root singularity that\n  governs `ACOS` at its endpoints governs `ACOSH` at `1`, and for the same reason — the inverse\n  of a function with a quadratic minimum.\n- **Asymptotic behaviour**: `acosh x = ln(2x) - 1/(4x^2) - ... ` as `x -> +infinity`. Growth is\n  logarithmic, so the whole upper half of the double range maps into a narrow band of results: at\n  the top of binary64 the answer is a little over 710. Every argument from about `1e100` to the\n  largest finite double produces an answer between roughly 230 and 711.\n- **Relations**: `acosh x = |asinh(sqrt(x^2 - 1))|` and `acosh x = atanh(sqrt(x^2-1)/x)`; also\n  `acosh(cosh t) = |t|`, which is the round trip Microsoft's Learn reference states (as\n  `Acosh(Cosh(number))` equalling the number — true for non-negative arguments, and the absolute\n  value is the part the documentation leaves out).\n- **Complex continuation**: `acosh` extends to the plane with a branch cut along\n  `(-infinity, 1]`. The real domain is exactly the complement of that cut on the real axis.\n\nAbramowitz & Stegun give the logarithmic closed forms for the inverse hyperbolic functions in\nchapter 4 section 4.6.\n\n\n\n### Arguments\n\n\n| Argument | Meaning | Default |\n|---|---|---|\n| `number` | Any real number equal to or greater than 1. Required. | — |\n\nThat wording is Microsoft's: the Learn reference describes the argument as \"any real number equal\nto or greater than 1\", and the description repeats that *number* must be greater than or equal\nto 1.\n\nThe misunderstood position is the *lower* bound. Readers who arrive from `ASINH`, which accepts\nevery real, or from `ACOS`, whose domain is `[-1, 1]`, routinely pass a value in `(0, 1)` and are\nsurprised by a domain failure. `[1, infinity)` is the complement of `ACOS`'s domain on the positive\naxis, and the two functions share exactly one point.\n\n\n"
  },
  "signature": {
    "display": "ACOSH(number)",
    "parameters": [
      {
        "description": null,
        "name": "number",
        "optional": false,
        "repeats": false
      }
    ],
    "trailing_repeats": false
  },
  "sources": {
    "metadata": {
      "admission": {
        "label": "implemented",
        "reason": null
      },
      "arity": {
        "max": 1,
        "min": 1
      },
      "category": "Math and trigonometry functions",
      "classification": {
        "arg_preparation_profile": "ValuesOnlyPreAdapter",
        "coercion_lift_profile": "UnaryNumericScalarOrArrayElementwise",
        "determinism_class": "Deterministic",
        "error_collapse_profile": "None",
        "fec_dependency_profile": "None",
        "host_interaction_class": "None",
        "kernel_signature_class": "Custom",
        "rich_value_usage": "RichBlind",
        "surface_fec_dependency_profile": "RefOnly",
        "thread_safety_class": "SafePure",
        "volatility_class": "NonVolatile"
      },
      "descriptions": {
        "long": null,
        "short": "Inverse of the hyperbolic cosine",
        "short_source": "dna-calc-own"
      },
      "docs": {
        "english_description": "Returns the inverse hyperbolic cosine of a number",
        "microsoft_url": "https://support.microsoft.com/en-us/office/acosh-function-e3992cc1-103f-4e72-9f04-624b9ef5ebfe"
      },
      "entry_kind": "built_in_function",
      "localized_family_names": null,
      "localized_names": [
        {
          "locale": "ar-SA",
          "name": "ACOSH"
        },
        {
          "locale": "bg-BG",
          "name": "ACOSH"
        },
        {
          "locale": "cs-CZ",
          "name": "ARCCOSH"
        },
        {
          "locale": "da-DK",
          "name": "ARCCOSH"
        },
        {
          "locale": "de-DE",
          "name": "ACOSH"
        },
        {
          "locale": "el-GR",
          "name": "ACOSH"
        },
        {
          "locale": "en-AU",
          "name": "ACOSH"
        },
        {
          "locale": "en-GB",
          "name": "ACOSH"
        },
        {
          "locale": "en-US",
          "name": "ACOSH"
        },
        {
          "locale": "es-ES",
          "name": "ACOSH"
        },
        {
          "locale": "et-EE",
          "name": "ACOSH"
        },
        {
          "locale": "fi-FI",
          "name": "ACOSH"
        },
        {
          "locale": "fr-FR",
          "name": "ACOSH"
        },
        {
          "locale": "he-IL",
          "name": "ACOSH"
        },
        {
          "locale": "hr-HR",
          "name": "ACOSH"
        },
        {
          "locale": "hu-HU",
          "name": "ACOSH"
        },
        {
          "locale": "id-ID",
          "name": "ACOSH"
        },
        {
          "locale": "it-IT",
          "name": "ACOSH"
        },
        {
          "locale": "ja-JP",
          "name": "ACOSH"
        },
        {
          "locale": "ko-KR",
          "name": "ACOSH"
        },
        {
          "locale": "lt-LT",
          "name": "ACOSH"
        },
        {
          "locale": "lv-LV",
          "name": "ACOSH"
        },
        {
          "locale": "nb-NO",
          "name": "ACOSH"
        },
        {
          "locale": "nl-NL",
          "name": "BOOGCOSH"
        },
        {
          "locale": "pl-PL",
          "name": "ACOSH"
        },
        {
          "locale": "pt-BR",
          "name": "ACOSH"
        },
        {
          "locale": "pt-PT",
          "name": "ACOSH"
        },
        {
          "locale": "ro-RO",
          "name": "ACOSH"
        },
        {
          "locale": "ru-RU",
          "name": "ACOSH"
        },
        {
          "locale": "sk-SK",
          "name": "ACOSH"
        },
        {
          "locale": "sl-SI",
          "name": "ACOSH"
        },
        {
          "locale": "sr-Latn-RS",
          "name": "ACOSH"
        },
        {
          "locale": "sv-SE",
          "name": "ARCCOSH"
        },
        {
          "locale": "th-TH",
          "name": "ACOSH"
        },
        {
          "locale": "tr-TR",
          "name": "ACOSH işlevi"
        },
        {
          "locale": "uk-UA",
          "name": "ACOSH"
        },
        {
          "locale": "vi-VN",
          "name": "ACOSH"
        },
        {
          "locale": "zh-CN",
          "name": "ACOSH"
        },
        {
          "locale": "zh-HK",
          "name": "ACOSH"
        },
        {
          "locale": "zh-TW",
          "name": "ACOSH"
        }
      ],
      "signature": {
        "display": "ACOSH(number)",
        "parameters": [
          {
            "description": null,
            "name": "number",
            "optional": false,
            "repeats": false
          }
        ],
        "trailing_repeats": false
      },
      "surface_name": "ACOSH",
      "version_marker": null,
      "xlcall": {
        "code": "233",
        "symbol": "xlfAcosh"
      }
    },
    "microsoft": "https://support.microsoft.com/en-us/office/acosh-function-e3992cc1-103f-4e72-9f04-624b9ef5ebfe"
  },
  "try_it": {
    "formula": "=ACOSH(1)"
  },
  "url": "https://handbook.dnacalc.com/functions/ACOSH.html",
  "variants": [],
  "versions": [
    {
      "behaviour": "27 captured inputs are indexed for this environment. Capture dates are not recorded. This is a reading count, not a comparison with another build.",
      "excel_build": "16.0 build 19929",
      "platform": "Windows, bitness not recorded, CPU not recorded",
      "sources": [
        "https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.ACOSH.json"
      ]
    },
    {
      "behaviour": "3,006 captured inputs are indexed for this environment. Capture dates: 2026-09-24 to 2026-09-25. This is a reading count, not a comparison with another build.",
      "excel_build": "16.0 build 20430",
      "platform": "Windows, 64-bit, AMD Ryzen 7 4800H with Radeon Graphics",
      "sources": [
        "https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.ACOSH.json"
      ]
    },
    {
      "behaviour": "1,224 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.",
      "excel_build": "16.0 build 20430",
      "platform": "Windows, 64-bit, CPU not recorded",
      "sources": [
        "https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.ACOSH.json"
      ]
    }
  ]
}