Independent recomputation
14 benchmark formulas in 31 notations, with references computed outside the engine, plus 3,000 random formulas checked against their own value. A second implementation in Python reproduces every reference.
Calculation validation
A calculation tool must compute the formula you see, or say that it cannot. This page sets out what we claim, the evidence for it, and how you can check it: published worked examples, unit definitions and thousands of tests, all run on the production engine in your browser.
Release check: 3,109 checks passed on calculation engine 2 (mathjs 15.2.0), commit 19cea31359f4, 2026-10-30.
What we claim
The principle
Engineering notation is not always unambiguous. Written inline, 5 kN / 2 m can be read as 2.5 kN/m or as 2.5 kN·m. MathCanvas does not choose one. A formula that reads in more than one way gets no result: the region shows a red border and says why. Write it with a fraction or brackets and it calculates.
A formula with exactly one meaning is computed as it is drawn. A fraction is one value, so in ⅛ q·L² the whole fraction multiplies q·L², and (a/b)² squares the whole fraction.
From formula to result
The MathLive editor stores what you see as LaTeX, so the stored formula has the same structure as the one on screen.
Fractions, powers, units and names become a single expression tree, written out with every bracket explicit: \frac{1}{8}q\cdot L^{2} becomes ((1 / 8) * q) * (L ^ 2). Notation with a second reading is refused here.
The open-source mathjs library evaluates the tree with 64-significant-digit decimal arithmetic and its unit system. 0.1 + 0.2 is exactly 0.3, and N/mm² converts to MPa.
MathCanvas, the AltoDocs API and the tools AI assistants use evaluate through the same engine, so a worksheet gives the same answer wherever it is calculated.
The evidence
A reference is only as good as its independence from the thing it checks. Each check below states where its reference comes from.
14 benchmark formulas in 31 notations, with references computed outside the engine, plus 3,000 random formulas checked against their own value. A second implementation in Python reproduces every reference.
22 printed results from worked examples published by the European Commission’s Joint Research Centre, each cited to the page.
22 unit conversions checked against their definitions in NIST Special Publication 811.
An independent reviewer examines the method, the cases and a release report. Not yet done; everything a reviewer needs is prepared, see below.
Behaviour checks complete the suite: 10 formulas whose drawn structure decides the value, 9 refused notations, rounded display, and the working shown for each result.
The button loads the calculation engine that MathCanvas, the API and the AI tools use, and runs every check on this page in your browser. No formula is sent to a server.
Level 2 · Published worked examples
Each row is evaluated from the inputs as printed. Printed results are rounded, so a row passes when the engine’s value rounds to the printed one. Every value was also recomputed outside the engine.
| Quantity | Formula | Where | Engine input | Printed | Engine |
|---|---|---|---|---|---|
| N_c,Rd | A·f_y/γ_M0 | §1.3.3.2, Example 3: HEB 340 column, S 355 (L. Simões da Silva, R. Simões), PDF p. 63 | \frac{170.9\operatorname{cm}^{2}\cdot 355\operatorname{MPa}}{1.00} | 6067,0 kN | Not run |
| λ₁ | π·√(E/f_y) | §1.3.3.2, Example 3: HEB 340 column, S 355 (L. Simões da Silva, R. Simões), PDF p. 63 | \operatorname{\pi}\cdot\sqrt{\frac{210\operatorname{GPa}}{355\operatorname{MPa}}} | 76,41 | Not run |
| λ_z | L_Ez/i_z | §1.3.3.2, Example 3: HEB 340 column, S 355 (L. Simões da Silva, R. Simões), PDF p. 63 | \frac{4.335\operatorname{m}}{7.53\operatorname{cm}} | 57,57 | Not run |
| λ̄_z | λ_z/λ₁ | §1.3.3.2, Example 3: HEB 340 column, S 355 (L. Simões da Silva, R. Simões), PDF p. 63 | \frac{57.57}{76.41} | 0,75 | Not run |
| Φ_z | 0.5·[1 + α(λ̄_z − 0.2) + λ̄_z²] | §1.3.3.2, Example 3: HEB 340 column, S 355 (L. Simões da Silva, R. Simões), PDF p. 63 | 0.5\cdot\left(1+0.49\cdot\left(0.75-0.2\right)+0.75^{2}\right) | 0,92 | Not run |
| χ_z | 1/(Φ_z + √(Φ_z² − λ̄_z²)) | §1.3.3.2, Example 3: HEB 340 column, S 355 (L. Simões da Silva, R. Simões), PDF p. 63 | \frac{1}{0.92+\sqrt{0.92^{2}-0.75^{2}}} | 0,69 | Not run |
| N_b,Rd | χ·A·f_y/γ_M1 | §1.3.3.2, Example 3: HEB 340 column, S 355 (L. Simões da Silva, R. Simões), PDF p. 63 | \frac{0.69\cdot 170.9\operatorname{cm}^{2}\cdot 355\operatorname{MPa}}{1.00} | 4186,2 kN | Not run |
| M_c,Rd | W_pl,y·f_y/γ_M0 | §1.3.4.2: IPE 400 beam, S 355 (L. Simões da Silva, R. Simões), PDF p. 74 | \frac{1307\operatorname{cm}^{3}\cdot 355\operatorname{MPa}}{1.00} | 464,0 kNm | Not run |
| V_pl,Rd | A_v·f_y/(√3·γ_M0) | §1.3.4.2: IPE 400 beam, S 355 (L. Simões da Silva, R. Simões), PDF p. 74 | \frac{42.69\operatorname{cm}^{2}\cdot 355\operatorname{MPa}}{\sqrt{3}\cdot 1.00} | 875,0 kN | Not run |
| λ̄_LT | √(W_y·f_y/M_cr) | §1.3.4.2: IPE 400 beam, S 355 (L. Simões da Silva, R. Simões), PDF p. 74 | \sqrt{\frac{1307\operatorname{cm}^{3}\cdot 355\operatorname{MPa}}{164.7\operatorname{kN}\cdot\operatorname{m}}} | 1,68 | Not run |
| Φ_LT | 0.5·[1 + α_LT(λ̄_LT − 0.2) + λ̄_LT²] | §1.3.4.2: IPE 400 beam, S 355 (L. Simões da Silva, R. Simões), PDF p. 74 | 0.5\cdot\left(1+0.34\cdot\left(1.68-0.2\right)+1.68^{2}\right) | 2,16 | Not run |
| χ_LT | 1/(Φ_LT + √(Φ_LT² − λ̄_LT²)) | §1.3.4.2: IPE 400 beam, S 355 (L. Simões da Silva, R. Simões), PDF p. 74 | \frac{1}{2.16+\sqrt{2.16^{2}-1.68^{2}}} | 0,28 | Not run |
| M_b,Rd | χ_LT·W_pl,y·f_y/γ_M1 | §1.3.4.2: IPE 400 beam, S 355 (L. Simões da Silva, R. Simões), PDF p. 74 | \frac{0.28\cdot 1307\operatorname{cm}^{3}\cdot 355\operatorname{MPa}}{1.00} | 129,9 kNm | Not run |
| V_pl,Rd (beam web) | A_v·f_y/(√3·γ_M0) | §2.2.7: header plate connection (F. Wald), PDF p. 120 | \frac{6.2\operatorname{mm}\cdot 130\operatorname{mm}\cdot 235\operatorname{MPa}}{\sqrt{3}\cdot 1.00} | 109,4 kN | Not run |
| F_v,Rd (M16, 4.6) | α_v·A_s·f_ub/γ_M2 | §2.2.7: header plate connection (F. Wald), PDF p. 120 | \frac{0.6\cdot 157\operatorname{mm}^{2}\cdot 400\operatorname{MPa}}{1.25} | 30,1 kN | Not run |
| F_w,Rd (fillet welds) | 2·a·L·f_u/(√3·β_w·γ_M2) | §2.2.7: header plate connection (F. Wald), PDF p. 121 | \frac{2\cdot 3\operatorname{mm}\cdot 130\operatorname{mm}\cdot 360\operatorname{MPa}}{\sqrt{3}\cdot 0.8\cdot 1.25} | 162,1 kN | Not run |
| F_v,Rd (M20) | α_v·A_s·f_ub/γ_M2 | §2.2.8: fin plate connection (F. Wald), PDF p. 122 | \frac{0.6\cdot 245\operatorname{mm}^{2}\cdot 500\operatorname{MPa}}{1.25} | 58,8 kN | Not run |
| F_b,Rd (beam web) | k₁·α_b·d·t·f_u/γ_M2 | §2.2.8: fin plate connection (F. Wald), PDF p. 122 | \frac{2.5\cdot 0.659\cdot 20\operatorname{mm}\cdot 5.6\operatorname{mm}\cdot 360\operatorname{MPa}}{1.25} | 53,1 kN | Not run |
| V_eff,2,Rd (fin plate) | 0.5·A_nt·f_u/γ_M2 + A_nv·f_y/(√3·γ_M0) | §2.2.8: fin plate connection (F. Wald), PDF p. 124 | \frac{0.5\cdot 290\operatorname{mm}^{2}\cdot 360\operatorname{MPa}}{1.25}+\frac{670\operatorname{mm}^{2}\cdot 235\operatorname{MPa}}{\sqrt{3}\cdot 1.00} | 132,7 kN | Not run |
| V_pl,Rd (fin plate) | A_v·f_y/(√3·γ_M0) | §2.2.8: fin plate connection (F. Wald), PDF p. 124 | \frac{10\operatorname{mm}\cdot 140\operatorname{mm}\cdot 235\operatorname{MPa}}{\sqrt{3}\cdot 1.00} | 189,9 kN | Not run |
| V_eff,2,Rd (beam web) | 0.5·A_nt·f_u/γ_M2 + A_nv·f_y/(√3·γ_M0) | §2.2.8: fin plate connection (F. Wald), PDF p. 124 | \frac{0.5\cdot 162.4\operatorname{mm}^{2}\cdot 360\operatorname{MPa}}{1.25}+\frac{515.2\operatorname{mm}^{2}\cdot 235\operatorname{MPa}}{\sqrt{3}\cdot 1.00} | 93,3 kN | Not run |
| M_el,Rd (fin plate) | W_el·f_y/γ_M0, W_el = t·h²/6 | §2.2.8: fin plate connection (F. Wald), PDF p. 124 | \frac{\frac{10\operatorname{mm}\cdot\left(140\operatorname{mm}\right)^{2}}{6}\cdot 235\operatorname{MPa}}{1.00} | 7,7 kNm | Not run |
Level 1 · Engineering benchmarks
Each worksheet defines its inputs, then evaluates the formula in every notation shown. References were computed outside the engine. Section properties are inputs, not table values. After a run, each formula also shows its working.
q := 12\operatorname{\textcolor{blue}{kN}}/\operatorname{\textcolor{blue}{m}}L := 6\operatorname{\textcolor{blue}{m}}E := 210\operatorname{GPa}I := 8356\operatorname{cm}^{4}\frac{q\cdot L^{2}}{8}Not run\frac{1}{8}q\cdot L^{2}Not run\frac{1}{8}\cdot q\cdot L^{2}Not run0.125\cdot q\cdot L^{2}Not runq\cdot L^{2}/8Not run\frac{q\cdot L}{2}Not run\frac{q}{2}LNot runq\cdot L/2Not run\frac{5\cdot q\cdot L^{4}}{384\cdot E\cdot I}Not run\frac{5}{384}\cdot\frac{q\cdot L^{4}}{E\cdot I}Not run\frac{5}{384}\frac{q L^{4}}{E I}Not run5\cdot q\cdot L^{4}/\left(384\cdot E\cdot I\right)Not runW_{pl} := 628.4\operatorname{cm}^{3}f_{y} := 235\operatorname{\textcolor{blue}{MPa}}\gamma_{M0} := 1.0M_{Ed} := 54\operatorname{kN}\cdot \operatorname{m}M_{c,Rd} := \frac{W_{pl}\cdot f_{y}}{\gamma_{M0}}Not runW_{pl}\cdot f_{y}/\gamma_{M0}Not run\frac{M_{Ed}}{M_{c,Rd}}Not runM_{Ed}/M_{c,Rd}Not runE := 210\operatorname{GPa}I := 8356\operatorname{cm}^{4}L_{cr} := 6\operatorname{m}\frac{\operatorname{\pi}^{2}\cdot E\cdot I}{L_{cr}^{2}}Not run\operatorname{\pi}^{2}\frac{E\cdot I}{L_{cr}^{2}}Not run\alpha_{cc} := 1.0f_{ck} := 30\operatorname{MPa}\gamma_{c} := 1.5M_{Ed} := 120\operatorname{kN}\cdot \operatorname{m}b := 300\operatorname{mm}d := 450\operatorname{mm}f_{cd} := \frac{\alpha_{cc}\cdot f_{ck}}{\gamma_{c}}Not run\alpha_{cc}\frac{f_{ck}}{\gamma_{c}}Not run\frac{M_{Ed}}{b\cdot d^{2}\cdot f_{cd}}Not runM_{Ed}/\left(b\cdot d^{2}\cdot f_{cd}\right)Not run\alpha_{v} := 0.6f_{ub} := 800\operatorname{MPa}A_{s} := 245\operatorname{mm}^{2}\gamma_{M2} := 1.25\frac{\alpha_{v}\cdot f_{ub}\cdot A_{s}}{\gamma_{M2}}Not run\alpha_{v}\cdot f_{ub}\cdot\frac{A_{s}}{\gamma_{M2}}Not runG_{k} := 10\operatorname{\textcolor{blue}{kN}}/\operatorname{\textcolor{blue}{m}}Q_{k} := 5\operatorname{\textcolor{blue}{kN}}/\operatorname{\textcolor{blue}{m}}\rho_{c} := 25\operatorname{kN}/\operatorname{m}^{3}h := 0.2\operatorname{m}1.35\cdot G_{k}+1.5\cdot Q_{k}Not run1.35G_{k}+1.5Q_{k}Not run\rho_{c}\cdot hNot run\mu_{1} := 0.8C_{e} := 1.0C_{t} := 1.0s_{k} := 1.0\operatorname{kN}/\operatorname{m}^{2}\mu_{1}\cdot C_{e}\cdot C_{t}\cdot s_{k}Not run\alpha_{T} := 12\cdot 10^{-6}\operatorname{K}^{-1}\Delta T := 30\operatorname{K}L_{0} := 10\operatorname{m}\alpha_{T}\cdot\Delta T\cdot L_{0}Not runw := 1.2\operatorname{kip}/\operatorname{ft}L_{s} := 20\operatorname{ft}\frac{w\cdot L_{s}^{2}}{8}Not run\frac{1}{8}w\cdot L_{s}^{2}Not runLevel 3 · Units
“Defined” values are exact by definition and must match to 12 significant digits; “derived” values are computed exactly from defined ones and must match to 9. The difference column shows the engine’s actual deviation. Source: A. Thompson and B. N. Taylor, Guide for the Use of the International System of Units (SI), NIST Special Publication 811, 2008 edition, Appendix B.
| Unit | Definition | Basis | Expected | Engine | Difference |
|---|---|---|---|---|---|
| 1 in | International inch (1959) | defined | 0.0254 m | Not run | — |
| 1 ft | International foot (1959) | defined | 0.3048 m | Not run | — |
| 1 yd | International yard (1959) | defined | 0.9144 m | Not run | — |
| 1 mi | International mile | defined | 1609.344 m | Not run | — |
| 1 lb | Avoirdupois pound (1959) | defined | 0.45359237 kg | Not run | — |
| 1 lbf | 1 lb × standard gravity | derived | 4.44822161526 N | Not run | — |
| 1 kip | 1000 lbf | derived | 4.44822161526 kN | Not run | — |
| 1 psi | 1 lbf/in² | derived | 6894.75729317 Pa | Not run | — |
| 1 ksi | 1000 lbf/in² | derived | 6.89475729317 MPa | Not run | — |
| 1 psf | 1 lbf/ft² | derived | 47.8802589803 Pa | Not run | — |
| 1 kip·ft | 1 kip × 1 ft | derived | 1.35581794833 kN m | Not run | — |
| 1 gal | US liquid gallon (231 in³) | defined | 3.785411784 L | Not run | — |
| 1 gₙ | Standard acceleration of gravity | defined | 9.80665 m/s^2 | Not run | — |
| 1 kgf | 1 kg × standard gravity | defined | 9.80665 N | Not run | — |
| 1 atm | Standard atmosphere | defined | 101325 Pa | Not run | — |
| 1 bar | 10⁵ Pa | defined | 100 kPa | Not run | — |
| 1° | π/180 rad | defined | 0.0174532925199 rad | Not run | — |
| 1 h | 3600 s | defined | 3600 s | Not run | — |
| 1 kWh | 3.6 × 10⁶ J | defined | 3.6 MJ | Not run | — |
| 1 MPa | SI prefixes | defined | 1 N/mm^2 | Not run | — |
| 1 t | Tonne (metric ton) | defined | 1000 kg | Not run | — |
| 1 ton | Read as the metric tonne; the US short ton is shortton | convention | 1000 kg | Not run | — |
Computed as drawn
With 5 definitions: q = 12 kN/m, L = 6 m, x = 4, a = 2 and b = 3.
| On the page | Engine input | Expected | Result |
|---|---|---|---|
| ⅛ q · L² | \frac{1}{8}q\cdot L^{2} | 54 kN m | Not run |
| (q/2) L | \frac{q}{2}L | 36 kN | Not run |
| (6/2) x | \frac{6}{2}x | 12 | Not run |
| (a/b)² | \frac{a}{b}^{2} | 0.444444 | Not run |
| −½ x | -\frac{1}{2}x | -2 | Not run |
| x ½ | x\frac{1}{2} | 2 | Not run |
| a ÷ (b/x) | a/\frac{b}{x} | 2.66667 | Not run |
| sin(π/2) | \sin\frac{\operatorname{\pi}}{2} | 1 | Not run |
| 0.1 + 0.2 | 0.1+0.2 | 0.3 | Not run |
| 5 N/mm² | 5\operatorname{N}/\operatorname{mm}^{2} | 5 MPa | Not run |
Rounded display, full-precision value: a = 1/3 shows as 0.33 at 2 decimals, yet 3·a is exactly 1, not 0.99.
Refused notation
Each of these is refused with a reason in the worksheet. Inline division with only one reading, such as 12 kN/m, a/b/c or a/b·c, still works and reads left to right.
| Written | Why it is refused | Write instead | Result |
|---|---|---|---|
| 5 kN / 2 m | 5 kN ÷ (2 m), or (5 kN ÷ 2) · m? | A fraction, or 5 kN / (2 m) | Should be refused |
| 1/2 m | Half a metre, or one over two metres? | A fraction, or 1/(2 m) | Should be refused |
| a/2b | a ÷ (2b), or (a ÷ 2) · b? | A fraction, or a/(2b) | Should be refused |
| 2 ½ | Two and a half, or two times a half? | 2 + ½ or 2 · ½ | Should be refused |
| 5%x | 5 % of x, or 5 modulo x? | 5 % · x | Should be refused |
| log(100) | Base 10 or base e? Tools differ. | log₁₀(100) or ln(100) | Should be refused |
| x(a + b) | A function x of a + b, or x times (a + b)? | x · (a + b) | Should be refused |
| 3 × 4 | × also means the cross product. | 3 · 4 | Should be refused |
| ± 3 | Two values in one result. | One region per case | Should be refused |
Check any result
Checking engineers verify a calculation line by line. MathCanvas shows each result the same way: the formula as the engine reads it, then the same formula with the values it used, then the result. Open the variable inspector on any finished region to see it; the API and AI tools return it with every result.
M_Ed = 1 / 8 * q * L ^ 2 = 1 / 8 * (12 kN / m) * (6 m) ^ 2 = 54 kN m
The working is checked too: evaluating each benchmark’s substituted line, with its displayed values, must give the result again.
Level 1 · Recompute it yourself
This script shares no code with the engine: plain Python floats and inputs typed in by hand. It recomputes every benchmark and published reference above, and our test suite checks that it agrees. Copy it and run it with any Python 3.
"""Independent recomputation of the AltoDocs validation references.
A second implementation in another language, sharing no code with the
calculation engine: plain Python floats, inputs typed in by hand from the
cases on altodocs.io/validation. Run it with any Python 3:
python3 references.py
It prints every reference in the order the validation page lists them, in
the units shown there. The engine's test suite runs this script and checks
that it agrees with the published case data.
"""
import json
from math import pi, sqrt
kN, m, mm, cm, MPa, GPa = 1e3, 1.0, 1e-3, 1e-2, 1e6, 1e9 # SI: N, m, Pa
SQRT3 = sqrt(3)
# Engineering benchmarks, in each check's unit.
q, L, E, I = 12 * kN / m, 6 * m, 210 * GPa, 8356 * cm**4
W_pl, f_y = 628.4 * cm**3, 235 * MPa
M_c_Rd = W_pl * f_y / 1.0
benchmarks = [
q * L**2 / 8 / (kN * m), # M = qL²/8 [kN m]
q * L / 2 / kN, # V = qL/2 [kN]
5 * q * L**4 / (384 * E * I) / mm, # δ = 5qL⁴/(384EI) [mm]
M_c_Rd / (kN * m), # M_c,Rd = W_pl f_y / γ_M0 [kN m]
54 * kN * m / M_c_Rd, # η = M_Ed / M_c,Rd [-]
pi**2 * E * I / (6 * m) ** 2 / kN, # N_cr = π²EI/L_cr² [kN]
1.0 * 30 * MPa / 1.5 / MPa, # f_cd = α_cc f_ck / γ_c [MPa]
120 * kN * m / (300 * mm * (450 * mm) ** 2 * (20 * MPa)), # μ [-]
0.6 * 800 * MPa * 245 * mm**2 / 1.25 / kN, # F_v,Rd [kN]
(1.35 * 10 + 1.5 * 5), # E_d [kN/m]
25 * 0.2, # g = ρh [kN/m²]
0.8 * 1.0 * 1.0 * 1.0, # s = μ₁ C_e C_t s_k [kN/m²]
12e-6 * 30 * 10 * m / mm, # ΔL = α ΔT L [mm]
1.2 * 20**2 / 8, # M = wL²/8 [kip ft]
]
# Published worked examples (JRC EUR 27346 EN), from the printed inputs.
published = [
170.9 * cm**2 * 355 * MPa / 1.00 / kN, # N_c,Rd [kN]
pi * sqrt(210 * GPa / (355 * MPa)), # λ₁
4.335 * m / (7.53 * cm), # λ_z
57.57 / 76.41, # λ̄_z
0.5 * (1 + 0.49 * (0.75 - 0.2) + 0.75**2), # Φ_z
1 / (0.92 + sqrt(0.92**2 - 0.75**2)), # χ_z
0.69 * 170.9 * cm**2 * 355 * MPa / 1.00 / kN, # N_b,Rd [kN]
1307 * cm**3 * 355 * MPa / 1.00 / (kN * m), # M_c,Rd [kN m]
42.69 * cm**2 * 355 * MPa / (SQRT3 * 1.00) / kN, # V_pl,Rd [kN]
sqrt(1307 * cm**3 * 355 * MPa / (164.7 * kN * m)), # λ̄_LT
0.5 * (1 + 0.34 * (1.68 - 0.2) + 1.68**2), # Φ_LT
1 / (2.16 + sqrt(2.16**2 - 1.68**2)), # χ_LT
0.28 * 1307 * cm**3 * 355 * MPa / 1.00 / (kN * m), # M_b,Rd [kN m]
6.2 * mm * 130 * mm * 235 * MPa / (SQRT3 * 1.00) / kN, # V_pl,Rd beam web [kN]
0.6 * 157 * mm**2 * 400 * MPa / 1.25 / kN, # F_v,Rd M16 [kN]
2 * 3 * mm * 130 * mm * 360 * MPa / (SQRT3 * 0.8 * 1.25) / kN, # F_w,Rd [kN]
0.6 * 245 * mm**2 * 500 * MPa / 1.25 / kN, # F_v,Rd M20 [kN]
2.5 * 0.659 * 20 * mm * 5.6 * mm * 360 * MPa / 1.25 / kN, # F_b,Rd beam web [kN]
(0.5 * 290 * mm**2 * 360 * MPa / 1.25 + 670 * mm**2 * 235 * MPa / (SQRT3 * 1.00)) / kN, # V_eff,2,Rd fin plate [kN]
10 * mm * 140 * mm * 235 * MPa / (SQRT3 * 1.00) / kN, # V_pl,Rd fin plate [kN]
(0.5 * 162.4 * mm**2 * 360 * MPa / 1.25 + 515.2 * mm**2 * 235 * MPa / (SQRT3 * 1.00)) / kN, # V_eff,2,Rd beam web [kN]
(10 * mm * (140 * mm) ** 2 / 6) * 235 * MPa / 1.00 / (kN * m), # M_el,Rd [kN m]
]
if __name__ == '__main__':
print(json.dumps({'benchmarks': benchmarks, 'published': published}, indent=2))
Release gate
The suite on this page runs before every release of the MathCanvas app and the calculation API, and when this page is built. If any case fails, the release stops. Every change that can alter a result gets a new engine version, and every confirmed calculation error becomes a permanent test case.
| Engine | Date | Change |
|---|---|---|
| 1 | Before 2026-10-30 | First public calculation engine. |
| 2 | 2026-10-30 | Formulas are read into one explicit tree; notation with two readings is refused with a reason; results carry their working. |
For reviewers
We have not yet commissioned an external review. Everything one needs is ready: a written validation plan stating the claims, the method, the acceptance criteria and the change-control rules; every case with its source; the release report for each version; notes on discrepancies we found in sources; and the test code on request.
If you are a reviewer, a university group or a firm that wants to assess the engine, contact us for the reviewer pack.
Scope
Send the formula, the inputs and the value you expected. A confirmed error is fixed and added to this suite. Reviewers: ask for the reviewer pack here too.