## Summary of the Pull Request Adds the missing trigonometric functions requested in #47093 to the Command Palette calculator, and fixes a regression where **all inverse trig/hyperbolic functions (`arcsin`, `arccos`, `arctan`, `arsinh`, `arcosh`, `artanh`) silently failed with a parse error**. **Bug fix:** since the mages → exprtk migration (#39972), the user-facing inverse-function names have still been accepted by input validation (`CalculateHelper.cs`) — they are native Mages function names and worked before the swap — but nothing maps them to exprtk's built-in names (`asin`, `acos`, `atan`, `asinh`, `acosh`, `atanh`), so exprtk returns a compile error and the calculator shows no result. The existing unit tests only covered the string transformation (`UpdateTrigFunctions`), never evaluation, so this went unnoticed. This PR registers the user-facing names as engine aliases and adds evaluation-level regression tests. **New functions:** - `cot`, `sec`, `csc` — exprtk-native; unblocked in input validation and wired into the degree/gradian trig-unit conversion - `arccot`, `arcsec`, `arccsc` — added to the engine (`arccot` uses `atan2(1, x)` for the continuous (0, π) branch, so `arccot(0) = π/2` and negative inputs land in (π/2, π)); also wired into trig-unit conversion - `coth`, `sech`, `csch` and `arcoth`, `arsech`, `arcsch` — added to the engine (hyperbolic, so no angle-unit conversion, consistent with `sinh`/`arsinh`) - `logn(x, base)` and `root(x, n)` — exprtk-native, unblocked in input validation (covers the "logarithm of n-th power" / "root of n-th degree" asks in the issue) ## PR Checklist - [x] Closes: #47093 - [x] **Communication:** The issue is labeled `Help Wanted` ("We encourage anyone to jump in on these and submit a PR.") - [x] **Tests:** Added/updated and all pass - [ ] **Localization:** No new end-user-facing strings (error paths reuse existing localized messages) - [ ] **Dev docs:** n/a - [ ] **New binaries:** n/a - [ ] **Documentation updated:** The docs page listing calculator functions may need updating; happy to file the docs PR once this is reviewed. ## Detailed Description of the Pull Request / Additional comments - `src/common/CalculatorEngineCommon/ExprtkEvaluator.cpp` - Registers aliases `arcsin/arccos/arctan/arsinh/arcosh/artanh` → `std::asin/acos/atan/asinh/acosh/atanh` (the bug fix). - Adds `coth/sech/csch` (reciprocal hyperbolics), `arccot/arcsec/arccsc`, and `arcoth/arsech/arcsch`, which exprtk does not provide. - `Microsoft.CmdPal.Ext.Calc/Helper/CalculateHelper.cs` - Whitelists the new function names in the input-validation regex. - Adds `cot/sec/csc` (argument conversion) and `arccot/arcsec/arccsc` (result conversion) to the degree/gradian handling in `UpdateTrigFunctions`. The existing `(?<!c)` look-behind logic correctly keeps `cot`↔`arccot`, `sec`↔`arcsec`, `csc`↔`arccsc`, and `cot`↔`coth` etc. apart (covered by tests). - `Microsoft.CmdPal.Ext.Calc/Helper/NumberTranslator.cs` - Adds the new names to the function-arity table so argument-separator protection works in decimal-comma locales (e.g. `logn(8; 2)` in de-DE). - The `log(` → `log10(` remapping in `CalculateEngine.cs` does not touch `logn(` (regex requires `(` directly after `log`); covered by a passing check. Behavior at undefined points maps to the existing error messages: `cot(0)`/`csch(0)` → ∞ → "out of bounds" error; `arcsin(2)`, `arcsec(0.5)`, `arcoth(0.5)` → NaN → "not a number" error (all covered by tests). PowerToys Run is unaffected: it still uses the Mages engine, which already supports the inverse-function names natively. ## Validation Steps Performed - Unit tests added: - Evaluation tests (`Interpret_NoErrors_WhenCalledWithRounding`) for all new functions **and** for the previously broken inverse functions (regression tests). - `InputValid` acceptance tests for every new name and rejection tests for bare names. - `UpdateTrigFunctions` transformation tests for degrees and gradians, including nesting (`sec(arcsec(2))`) and confirming hyperbolics are untouched. - End-to-end `TrigModeSettingsTest` rows through `CalculatorListPage` (e.g. `sec(60)` = 2 in degrees, `arccot(1)` = 45°, `cot(50)` = 1 in gradians). - Error-path tests for `cot(0)`, `csch(0)`, `arcsin(2)`, `arcsec(0.5)`, `arcoth(0.5)`. - The modified `ExprtkEvaluator.cpp` was additionally exercised standalone against the vendored `exprtk.hpp` with the exact parser settings used in production: 27 evaluation cases (including degree-mode composites exactly as `CalculateHelper` emits them) all pass, and all expected values in the test `DataRow`s are taken verbatim from the engine output. ### Screenshots **Built and ran locally (Debug build — note the "DBG | NO AOT" badge in the shots).** **_Before (shipping 0.100.2 — these all fail):_** <img width="786" alt="failed-arcsin" src="https://github.com/user-attachments/assets/4116c428-2804-43d7-b04b-9b02f7d374cc" /> <img width="784" alt="failed-cot" src="https://github.com/user-attachments/assets/b81d39df-dffd-4e8d-8af8-9d21552c5e89" /> <img width="784" alt="failed-logn" src="https://github.com/user-attachments/assets/b2eec32c-95e8-4b0a-b44f-47a30193a012" /> **_After (this PR):_** <img width="766" alt="arcsin" src="https://github.com/user-attachments/assets/9d8b2235-1330-433d-b0d5-5ad2527c1c01" /> <img width="766" alt="cot" src="https://github.com/user-attachments/assets/c2a4454f-1e46-4022-8107-7e0c9aff5a7e" /> <img width="767" alt="logn" src="https://github.com/user-attachments/assets/e6476cb9-3bf5-40e0-9b45-08a0add42124" /> <img width="764" alt="root" src="https://github.com/user-attachments/assets/97036055-1ee0-4355-b99f-891f4129e463" /> <img width="764" alt="sec1" src="https://github.com/user-attachments/assets/b82119f4-e6bb-47a7-8da7-0c3fd1272d70" /> <img width="766" alt="sech" src="https://github.com/user-attachments/assets/6363f938-8cbf-4d86-8784-d8288953786e" /> **_Recording_** https://github.com/user-attachments/assets/42c11e25-c342-4461-a9d4-e40d836d060c Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Microsoft PowerToys
Microsoft PowerToys is a collection of utilities that help you customize Windows and streamline everyday tasks.
Installation · Documentation · Blog · Release notes
🔨 Utilities
PowerToys includes over 30 utilities to help you customize and optimize your Windows experience:
📦 Installation
For detailed installation instructions and system requirements, visit the installation docs.
But to get started quickly, choose one of the installation methods below:
Download the .exe file from GitHub
Go to the PowerToys GitHub releases, scroll down and select Assets to reveal the installation files, and choose the one that matches your architecture and install scope. For most devices, that would be x64 per-user.
WinGet
Download PowerToys from [WinGet](https://github.com/microsoft/winget-cli#installing-the-client). Updating PowerToys via winget will respect the current PowerToys installation scope. To install PowerToys, run the following command from the command line / PowerShell:
- User scope installer (default)
winget install Microsoft.PowerToys -s winget
- Machine-wide scope installer
winget install --scope machine Microsoft.PowerToys -s winget
Other methods
There are [community driven install methods](https://learn.microsoft.com/windows/powertoys/install#community-driven-install-tools) such as Chocolatey and Scoop. If these are your preferred install solutions, you can find the install instructions there.
✨ What's new?
To see what's new, check out the release notes.
🛣️ Roadmap
We are planning some nice new features and improvements for the next releases – a brand-new Shortcut Guide experience, ensuring it's easier to find and install Command Palette extensions and so much more! Stay tuned for v0.100!
❤️ PowerToys Community
The PowerToys team is extremely grateful to have the support of an amazing active community. The work you do is incredibly important. PowerToys wouldn't be nearly what it is today without your help filing bugs, updating documentation, guiding the design, or writing features. We want to say thank you and take time to recognize your work. Your contributions and feedback improve PowerToys month after month!
Contributing
This project welcomes contributions of all types. Besides coding features / bug fixes, other ways to assist include spec writing, design, documentation, and finding bugs. We are excited to work with the power user community to build a set of tools for helping you get the most out of Windows. We ask that before you start work on a feature that you would like to contribute, please read our Contributor's Guide. We would be happy to work with you to figure out the best approach, provide guidance and mentorship throughout feature development, and help avoid any wasted or duplicate effort. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you grant us the rights to use your contribution and that you have permission to do so. For guidance on developing for PowerToys, please read the developer docs for a detailed breakdown. This includes how to setup your computer to compile.
Code of conduct
This project has adopted the Microsoft Open Source Code of Conduct.
Privacy statement
The application logs basic diagnostic data (telemetry). For more privacy information and what we collect, see our PowerToys Data and Privacy documentation.

