AltoDocs

Calculation validation

How we validate MathCanvas. Run every check yourself.

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

Precise claims, each with evidence.

  • We compute the formula you see. Every formula is read into one explicit structure; notation with two readings is refused, not guessed.
  • The arithmetic and units are right. Results agree with published worked examples, defined unit values and independent recomputation.
  • The same answer everywhere. MathCanvas, the API and the AI tools evaluate through one engine.
  • You can check any result. Every result shows its working, with the values it used.
  • We do not claim your design is right. The formula, the loads and the clause are the engineer’s responsibility.

The principle

One meaning, or no answer.

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

What happens when you press =

  1. You write the formula.

    The MathLive editor stores what you see as LaTeX, so the stored formula has the same structure as the one on screen.

  2. MathCanvas reads it into one tree.

    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.

  3. mathjs computes it.

    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.

  4. One engine everywhere.

    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

References, by how independent they are

A reference is only as good as its independence from the thing it checks. Each check below states where its reference comes from.

Level 1

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.

Level 2

Published third-party results

22 printed results from worked examples published by the European Commission’s Joint Research Centre, each cited to the page.

Level 3

Values fixed by definition

22 unit conversions checked against their definitions in NIST Special Publication 811.

Level 4

External review

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.

Run the validation yourself

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

Printed results from an official worked-example report

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.

Source: M. Veljkovic et al. (eds.), Eurocodes: Background & Applications. Design of Steel Buildings. Worked examples. JRC Science and Policy Report EUR 27346 EN, Publications Office of the European Union, 2015. ISBN 978-92-79-49573-1, doi:10.2788/605700.

QuantityFormulaWhereEngine inputPrintedEngine
N_c,RdA·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 kNNot 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,41Not run
λ_zL_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,57Not 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,75Not run
Φ_z0.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. 630.5\cdot\left(1+0.49\cdot\left(0.75-0.2\right)+0.75^{2}\right)0,92Not run
χ_z1/(Φ_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,69Not 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 kNNot run
M_c,RdW_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 kNmNot run
V_pl,RdA_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 kNNot 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,68Not run
Φ_LT0.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. 740.5\cdot\left(1+0.34\cdot\left(1.68-0.2\right)+1.68^{2}\right)2,16Not run
χ_LT1/(Φ_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,28Not 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 kNmNot 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 kNNot 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 kNNot 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 kNNot 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 kNNot 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 kNNot 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 kNNot 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 kNNot 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 kNNot 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 kNmNot run

Level 1 · Engineering benchmarks

Every notation, one reference value

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.

Simply supported beam, uniform load

Inputsq := 12\operatorname{\textcolor{blue}{kN}}/\operatorname{\textcolor{blue}{m}}L := 6\operatorname{\textcolor{blue}{m}}E := 210\operatorname{GPa}I := 8356\operatorname{cm}^{4}
M = qL²/8Beam staticsReference: 54 kN m
  • \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 run
  • 0.125\cdot q\cdot L^{2}Not run
  • q\cdot L^{2}/8Not run
V = qL/2Beam staticsReference: 36 kN
  • \frac{q\cdot L}{2}Not run
  • \frac{q}{2}LNot run
  • q\cdot L/2Not run
δ = 5qL⁴/(384EI)Beam staticsReference: 11.54 mm
  • \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 run
  • 5\cdot q\cdot L^{4}/\left(384\cdot E\cdot I\right)Not run

Steel bending resistance and utilisation

InputsW_{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 = W_pl·f_y/γ_M0EN 1993-1-1, 6.2.5 (6.13)Reference: 147.674 kN m
  • M_{c,Rd} := \frac{W_{pl}\cdot f_{y}}{\gamma_{M0}}Not run
  • W_{pl}\cdot f_{y}/\gamma_{M0}Not run
η = M_Ed/M_c,RdUtilisationReference: 0.36567
  • \frac{M_{Ed}}{M_{c,Rd}}Not run
  • M_{Ed}/M_{c,Rd}Not run

Euler critical load

InputsE := 210\operatorname{GPa}I := 8356\operatorname{cm}^{4}L_{cr} := 6\operatorname{m}
N_cr = π²EI/L_cr²Elastic bucklingReference: 4810.77 kN
  • \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

Concrete design strength and relative moment

Inputs\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 = α_cc·f_ck/γ_cEN 1992-1-1, 3.1.6 (3.15)Reference: 20 MPa
  • f_{cd} := \frac{\alpha_{cc}\cdot f_{ck}}{\gamma_{c}}Not run
  • \alpha_{cc}\frac{f_{ck}}{\gamma_{c}}Not run
μ = M_Ed/(b·d²·f_cd)Rectangular section designReference: 0.0987654
  • \frac{M_{Ed}}{b\cdot d^{2}\cdot f_{cd}}Not run
  • M_{Ed}/\left(b\cdot d^{2}\cdot f_{cd}\right)Not run

Bolt shear resistance, M20 8.8

Inputs\alpha_{v} := 0.6f_{ub} := 800\operatorname{MPa}A_{s} := 245\operatorname{mm}^{2}\gamma_{M2} := 1.25
F_v,Rd = α_v·f_ub·A_s/γ_M2EN 1993-1-8, Table 3.4Reference: 94.08 kN
  • \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 run

Load combination and self-weight

InputsG_{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}
E_d = 1.35·G_k + 1.5·Q_kEN 1990, (6.10)Reference: 21 kN/m
  • 1.35\cdot G_{k}+1.5\cdot Q_{k}Not run
  • 1.35G_{k}+1.5Q_{k}Not run
g = ρ·hSelf-weightReference: 5 kN/m^2
  • \rho_{c}\cdot hNot run

Roof snow load

Inputs\mu_{1} := 0.8C_{e} := 1.0C_{t} := 1.0s_{k} := 1.0\operatorname{kN}/\operatorname{m}^{2}
s = μ₁·C_e·C_t·s_kEN 1991-1-3, (5.1)Reference: 0.8 kN/m^2
  • \mu_{1}\cdot C_{e}\cdot C_{t}\cdot s_{k}Not run

Thermal elongation

Inputs\alpha_{T} := 12\cdot 10^{-6}\operatorname{K}^{-1}\Delta T := 30\operatorname{K}L_{0} := 10\operatorname{m}
ΔL = α·ΔT·LLinear thermal expansionReference: 3.6 mm
  • \alpha_{T}\cdot\Delta T\cdot L_{0}Not run

Imperial beam, uniform load (US customary units)

Inputsw := 1.2\operatorname{kip}/\operatorname{ft}L_{s} := 20\operatorname{ft}
M = wL²/8Beam statics, US customary unitsReference: 60 kip ft
  • \frac{w\cdot L_{s}^{2}}{8}Not run
  • \frac{1}{8}w\cdot L_{s}^{2}Not run

Level 3 · Units

Every conversion against its definition

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

UnitDefinitionBasisExpectedEngineDifference
1 inInternational inch (1959)defined0.0254 mNot run—
1 ftInternational foot (1959)defined0.3048 mNot run—
1 ydInternational yard (1959)defined0.9144 mNot run—
1 miInternational miledefined1609.344 mNot run—
1 lbAvoirdupois pound (1959)defined0.45359237 kgNot run—
1 lbf1 lb × standard gravityderived4.44822161526 NNot run—
1 kip1000 lbfderived4.44822161526 kNNot run—
1 psi1 lbf/in²derived6894.75729317 PaNot run—
1 ksi1000 lbf/in²derived6.89475729317 MPaNot run—
1 psf1 lbf/ft²derived47.8802589803 PaNot run—
1 kip·ft1 kip × 1 ftderived1.35581794833 kN mNot run—
1 galUS liquid gallon (231 in³)defined3.785411784 LNot run—
1 gₙStandard acceleration of gravitydefined9.80665 m/s^2Not run—
1 kgf1 kg × standard gravitydefined9.80665 NNot run—
1 atmStandard atmospheredefined101325 PaNot run—
1 bar10⁵ Padefined100 kPaNot run—
1°π/180 raddefined0.0174532925199 radNot run—
1 h3600 sdefined3600 sNot run—
1 kWh3.6 × 10⁶ Jdefined3.6 MJNot run—
1 MPaSI prefixesdefined1 N/mm^2Not run—
1 tTonne (metric ton)defined1000 kgNot run—
1 tonRead as the metric tonne; the US short ton is shorttonconvention1000 kgNot run—

Computed as drawn

The structure you see decides the value

With 5 definitions: q = 12 kN/m, L = 6 m, x = 4, a = 2 and b = 3.

On the pageEngine inputExpectedResult
⅛ q · L²\frac{1}{8}q\cdot L^{2}54 kN mNot run
(q/2) L\frac{q}{2}L36 kNNot run
(6/2) x\frac{6}{2}x12Not run
(a/b)²\frac{a}{b}^{2}0.444444Not run
−½ x-\frac{1}{2}x-2Not run
x ½x\frac{1}{2}2Not run
a ÷ (b/x)a/\frac{b}{x}2.66667Not run
sin(π/2)\sin\frac{\operatorname{\pi}}{2}1Not run
0.1 + 0.20.1+0.20.3Not run
5 N/mm²5\operatorname{N}/\operatorname{mm}^{2}5 MPaNot 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

Two readings, so no answer

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.

WrittenWhy it is refusedWrite insteadResult
5 kN / 2 m5 kN ÷ (2 m), or (5 kN ÷ 2) · m?A fraction, or 5 kN / (2 m)Should be refused
1/2 mHalf a metre, or one over two metres?A fraction, or 1/(2 m)Should be refused
a/2ba ÷ (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%x5 % of x, or 5 modulo x?5 % · xShould 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 · 4Should be refused
± 3Two values in one result.One region per caseShould be refused

Check any result

Every result shows its working.

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

A second implementation, in Python

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.

Show references.py
"""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

No release ships unless every check passes.

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.

EngineDateChange
1Before 2026-10-30First public calculation engine.
22026-10-30Formulas are read into one explicit tree; notation with two readings is refused with a reason; results carry their working.

For reviewers

Prepared for independent review.

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

What this does not cover

  • Your engineering judgement. The engine computes the formula you write. It does not check that the formula, the loads or the clause are right for your design.
  • Code compliance. A validated calculation is not a certified design.
  • Other engines. Python cells, spreadsheets and beam analysis run in their own engines and are not part of this suite.
  • Conventions. Trigonometric functions take radians unless the angle has a unit, as in sin(30 deg). ln is the natural logarithm; log needs a stated base. Results keep full precision; only the display is rounded.

Found a result that looks wrong?

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.

contact@altodocs.io