Subhro-ai bf14ebcec9 [CmdPal Calculator] Add reciprocal/inverse trig functions and n-th log/root; fix inverse function parse errors (#49356)
## 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>
2026-07-17 13:54:11 -05:00

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:

Advanced Paste icon Advanced Paste Always on Top icon Always on Top Awake icon Awake
Color Picker icon Color Picker Command Not Found icon Command Not Found Command Palette icon Command Palette
Crop and Lock icon Crop And Lock Environment Variables icon Environment Variables FancyZones icon FancyZones
File Explorer Add-ons icon File Explorer Add-ons File Locksmith icon File Locksmith Grab And Move icon Grab And Move
Hosts File Editor icon Hosts File Editor Image Resizer icon Image Resizer Keyboard Manager icon Keyboard Manager
Light Switch icon Light Switch Mouse Utilities icon Mouse Utilities Mouse Without Borders icon Mouse Without Borders
New+ icon New+ Peek icon Peek PowerDisplay icon PowerDisplay
PowerRename icon PowerRename PowerToys Run icon PowerToys Run Quick Accent icon Quick Accent
Registry Preview icon Registry Preview Screen Ruler icon Screen Ruler Shortcut Guide icon Shortcut Guide
Text Extractor icon Text Extractor Workspaces icon Workspaces ZoomIt icon ZoomIt

📦 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.

Microsoft Store
You can easily install PowerToys from the Microsoft Store:

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?

What's new image

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.

Description
Microsoft PowerToys is a collection of utilities that help you customize Windows and streamline everyday tasks
Readme MIT 743 MiB
Languages
C 44.9%
C# 26.4%
JavaScript 14%
C++ 13.8%
PowerShell 0.6%
Other 0.2%