# TinyExpr++ — Expression Evaluator in Notepad3 Notepad3 includes [TinyExpr++](https://blake-madden.github.io/tinyexpr-plusplus/), a math expression parser and evaluator. It is used in several places throughout the application to let you write and evaluate math formulas directly. ## Where Expressions Are Used ### 1. Inline Expression Evaluation (`=?`) Type a math expression followed by `=?` (or `=` then press **Enter**) to evaluate it in-place. **Enable:** Menu → Settings → *Evaluate TinyExpr on Selection* **Example:** ``` (3+4)*5=? ``` The `=?` and the expression are replaced with the result: `35` This also works with selected text — select a math expression, and its result appears in the **status bar**. ### 2. Status Bar Expression Display When *Evaluate TinyExpr on Selection* is enabled, selecting any text containing a valid expression shows its computed value in the status bar's TinyExpr field. **Multi-selection / rectangular selection** is supported — selected values are concatenated and evaluated as a single expression. ### 3. Go to Line / Column Dialog The **Go to Line** dialog (Ctrl+G) accepts expressions, not just numbers: | Input | Result | |-------|--------| | `100` | Goes to line 100 | | `50+25` | Goes to line 75 | | `2^10` | Goes to line 1024 | The same applies to the **Column** field. ### 4. Line Number Expressions (Modify Lines) The **Modify Lines** dialog (Alt+M) supports expressions in its prefix/append patterns using the `${expression}` syntax. Three variables are available: | Variable | Description | |----------|-------------| | `L` | Current 1-based line number in the file | | `I` | Zero-based iteration index (0, 1, 2, …) | | `N` | One-based iteration counter (1, 2, 3, …) | **Examples:** | Pattern | Lines 5–8 produce | |---------|--------------------| | `${N}` | 1, 2, 3, 4 | | `${L}` | 5, 6, 7, 8 | | `${N*10}` | 10, 20, 30, 40 | | `${L^2}` | 25, 36, 49, 64 | | `${0N}` | 1, 2, 3, 4 (zero-padded) | ### 5. Auto-Save Interval The auto-save interval field in Settings accepts expressions (e.g., `60*5` for 5 minutes). ### 6. Dark Mode Contrast Setting The Dark Mode highlight contrast value in the Customize Schemes dialog accepts expressions. --- ## Expression Syntax ### Numbers | Format | Example | Value | |--------|---------|-------| | Integer | `42` | 42 | | Decimal | `3.14` | 3.14 | | Leading dot | `.5` | 0.5 | | Hexadecimal | `0x1F` | 31 | | Scientific | `1e3` | 1000 | | Negative scientific | `2.5e-2` | 0.025 | ### Operators (by Precedence) From highest to lowest precedence: | Precedence | Operators | Description | |:----------:|-----------|-------------| | 1 | `( )` | Grouping | | 2 | `+` `-` `~` | Unary plus, minus, bitwise NOT | | 3 | `^` `**` | Exponentiation | | 4 | `*` `/` `%` | Multiply, divide, modulus | | 5 | `+` `-` | Add, subtract | | 6 | `<<` `>>` `<<<` `>>>` | Bit shift, bit rotate | | 7 | `<` `>` `<=` `>=` | Relational comparison | | 8 | `=` `==` `<>` `!=` | Equality / inequality | | 9 | `&&` | Logical AND | | 10 | `\|\|` | Logical OR | > **Note:** `%` is the **modulus** operator (remainder), not a percentage sign. **Examples:** ``` 5+5+5/2 → 12.5 (division before addition) (5+5+5)/2 → 7.5 (parentheses override precedence) 2+5^2 → 27 (exponentiation before addition) (2+5)^2 → 49 10 % 3 → 1 (remainder of 10÷3) ``` ### Constants | Constant | Value | |----------|-------| | `PI` | 3.14159265358979… | | `E` | 2.71828182845905… | | `TRUE` | 1 | | `FALSE` | 0 | | `NAN` | Not-a-Number (invalid) | ### Comments C/C++ style comments are supported inside expressions: ``` (3 + 4) /* this is a comment */ * 2 → 14 5 + 3 // rest of line is ignored → 8 ``` --- ## Function Reference All function names are **case-insensitive** (`sin`, `SIN`, `Sin` all work). ### Basic Math | Function | Description | Example | |----------|-------------|---------| | `ABS(x)` | Absolute value | `ABS(-5)` → `5` | | `CEIL(x)` | Round up to integer | `CEIL(2.3)` → `3` | | `FLOOR(x)` | Round down to integer | `FLOOR(2.7)` → `2` | | `ROUND(x, n)` | Round to *n* decimal places | `ROUND(3.456, 2)` → `3.46` | | `TRUNC(x)` | Discard fractional part | `TRUNC(3.7)` → `3` | | `SIGN(x)` | Sign: 1, 0, or −1 | `SIGN(-7)` → `-1` | | `CLAMP(x, lo, hi)` | Constrain to range | `CLAMP(15, 0, 10)` → `10` | | `EVEN(x)` | Round up to nearest even | `EVEN(3)` → `4` | | `ODD(x)` | Round up to nearest odd | `ODD(4)` → `5` | ### Powers & Roots | Function | Description | Example | |----------|-------------|---------| | `SQRT(x)` | Square root | `SQRT(16)` → `4` | | `POW(x, y)` | *x* raised to *y* | `POW(2, 10)` → `1024` | | `POWER(x, y)` | Alias for `POW` | | | `EXP(x)` | *e* raised to *x* | `EXP(1)` → `2.71828…` | ### Logarithms | Function | Description | Example | |----------|-------------|---------| | `LN(x)` | Natural log (base *e*) | `LN(E)` → `1` | | `LOG10(x)` | Common log (base 10) | `LOG10(1000)` → `3` | | `LOG(x)` | Same as `LOG10` (compatibility) | `LOG(100)` → `2` | ### Trigonometry | Function | Description | |----------|-------------| | `SIN(x)` | Sine (radians) | | `COS(x)` | Cosine (radians) | | `TAN(x)` | Tangent | | `COT(x)` | Cotangent | | `ASIN(x)` | Arcsine → radians | | `ACOS(x)` | Arccosine → radians | | `ATAN(x)` | Arctangent → radians | | `ATAN2(y, x)` | Arctangent of *y/x* → radians | | `SINH(x)` | Hyperbolic sine | | `COSH(x)` | Hyperbolic cosine | ### Statistics | Function | Description | Example | |----------|-------------|---------| | `SUM(a, b, …)` | Sum of values (up to 24 args) | `SUM(1,2,3)` → `6` | | `AVERAGE(a, b, …)` | Mean of values (up to 24 args) | `AVERAGE(2,4,6)` → `4` | | `MIN(a, b, …)` | Smallest value (up to 24 args) | `MIN(3,1,2)` → `1` | | `MAX(a, b, …)` | Largest value (up to 24 args) | `MAX(3,1,2)` → `3` | ### Combinatorics | Function | Description | Example | |----------|-------------|---------| | `FAC(n)` / `FACT(n)` | Factorial (*n!*) | `FAC(5)` → `120` | | `COMBIN(n, k)` / `NCR(n, k)` | Combinations | `COMBIN(5,2)` → `10` | | `PERMUT(n, k)` / `NPR(n, k)` | Permutations | `PERMUT(5,2)` → `20` | | `TGAMMA(x)` / `GAMMA(x)` | Gamma function | | ### Logic | Function | Description | Example | |----------|-------------|---------| | `IF(cond, yes, no)` | Conditional | `IF(1>2, 10, 20)` → `20` | | `IFS(c1,v1, c2,v2, …)` | Multi-condition (up to 12 pairs) | `IFS(0,1, 1,2)` → `2` | | `AND(a, b, …)` | All true? (up to 24 args) | `AND(1,1,0)` → `0` | | `OR(a, b, …)` | Any true? (up to 24 args) | `OR(0,0,1)` → `1` | | `NOT(x)` | Logical negation | `NOT(0)` → `1` | ### Error Checking | Function | Description | |----------|-------------| | `NA()` / `NAN` | Returns NaN (invalid value) | | `ISERR(x)` / `ISERROR(x)` | 1 if *x* is NaN, else 0 | | `ISNA(x)` / `ISNAN(x)` | Alias for `ISERR` | | `ISEVEN(x)` | 1 if *x* is even | | `ISODD(x)` | 1 if *x* is odd | ### Bitwise Operations | Function | Description | |----------|-------------| | `BITAND(a, b)` | Bitwise AND | | `BITOR(a, b)` | Bitwise OR | | `BITXOR(a, b)` | Bitwise XOR | | `BITNOT(x)` | Bitwise NOT (auto-selects 32 or 64 bit) | | `BITLSHIFT(x, n)` | Left shift by *n* | | `BITRSHIFT(x, n)` | Right shift by *n* | | `RAND()` | Random number between 0 and 1 | ### Financial Functions | Function | Description | |----------|-------------| | `FV(rate, nper, pmt, [pv], [type])` | Future value | | `PV(rate, nper, pmt, [fv], [type])` | Present value | | `PMT(rate, nper, pv, [fv], [type])` | Periodic payment | | `NPER(rate, pmt, pv, [fv], [type])` | Number of periods | | `IPMT(rate, per, nper, pv, [fv], [type])` | Interest portion | | `PPMT(rate, per, nper, pv, [fv], [type])` | Principal portion | > Optional parameters `[…]` default to 0. The `type` parameter: `0` = end of period, `1` = beginning. --- ## Practical Examples ### Quick Calculations ``` 256*1024=? → 262144 SQRT(3^2 + 4^2)=? → 5 2*PI*6.371e6=? → 40030173.592… (Earth's circumference in meters) ``` ### Unit Conversions ``` 72 * 0.0254=? → 1.8288 (72 inches to meters) 100 / 2.54=? → 39.3701 (100 cm to inches) (98.6 - 32) * 5/9=? → 37 (Fahrenheit to Celsius) ``` ### Programming Helpers ``` 0xFF=? → 255 2^16 - 1=? → 65535 BITLSHIFT(1, 20)=? → 1048576 (1 MB in bytes) BITAND(0xF0, 0x3C)=? → 48 ``` ### Line Numbering (Modify Lines Dialog) | Goal | Prefix pattern | |------|---------------| | Simple line numbers | `${N}. ` | | Multiples of 10 | `${N*10}: ` | | Even numbers only | `${N*2}: ` | | Squared sequence | `${N^2} ` | | Zero-padded (001, 002…) | `${0N}. ` | | Reverse from 100 | `${100-I} ` | | Starting from line number | `${L}: ` | ### Conditional Logic ``` IF(5>3, 100, 200)=? → 100 IF(AND(10>=5, 10<=15), 1, 0)=? → 1 (range check) IFS(90>=90, 4, 90>=80, 3, 90>=70, 2, 1,1)=? → 4 (grading) ``` --- ## Locale-Aware Number Formatting TinyExpr++ in Notepad3 automatically adapts to the **decimal separator** of the active UI language. When Notepad3 is set to a locale that uses a comma as the decimal mark (e.g., German, French, Spanish), the expression engine switches accordingly: | | English (en-US) | German (de-DE) | |---|---|---| | **Decimal separator** | `.` (dot) | `,` (comma) | | **Function argument separator** | `,` (comma) | `;` (semicolon) | | **Number example** | `3.14` | `3,14` | | **Function call** | `SUM(1.5, 2)` | `SUM(1,5; 2)` | | **Inline evaluation** | `1/3=?` → `0.33333333` | `1/3=?` → `0,33333333` | ### Examples by Locale **English (dot decimal):** ``` ROUND(PI, 4)=? → 3.1416 SUM(1.5, 2.5, 3)=? → 7 IF(2.5 > 1, 10, 20)=? → 10 ``` **German / French / Spanish (comma decimal):** ``` ROUND(PI; 4)=? → 3,1416 SUM(1,5; 2,5; 3)=? → 7 IF(2,5 > 1; 10; 20)=? → 10 ``` > **Tip:** The separator style follows the Notepad3 UI language, which is set in *Settings → Preferred Language*. It does not change when editing files in different encodings. --- ## Notes - All function names are **case-insensitive**. - `LOG(x)` is provided for backward compatibility and evaluates as `LOG10(x)`. - The `%` operator computes the **modulus** (remainder), not a percentage. - Expressions support **C/C++ style comments** (`/* … */` and `// …`). - Invalid operations (division by zero, `SQRT(-1)`) return **NaN**. For the full TinyExpr++ reference, see the [TinyExpr++ documentation](https://blake-madden.github.io/tinyexpr-plusplus/).