Thermal expansion to 20 °C

Correct a length measured away from 20 °C to the ISO 1 reference temperature, or find the differential expansion between a unit under test and its standard (gauge block on a comparator, micrometer on a setting standard) with separate α and temperature for each. Returns the uncertainty rows for α and temperature, with sensitivity coefficients, ready for the uncertainty budget.

Thermal expansion · 20 °C reference

v0.1.0 · ISO 1 · GUM H.1
Length at 20 °C100.000050 mmcorrection -0.00575 mm · linearized L_t(1 − αθ) differs by 0.000000331 mm · thermal u = 0.000579 mm
Uncertainty rows for the budget
InputDistributionu (input unit)c|c|·u (mm)
Expansion coefficient αnormal, k = 10.00000115 1/K-5000.000575
Temperature trectangular0.0577 °C-0.001150.0000664
Rows for the uncertainty budget (JSON)

[ { "type": "B", "name": "Expansion coefficient α", "unit": "1/K", "distribution": "normal", "k": 1, "sensitivity": -499.97150162428244, "half_width": 0.00000115 }, { "type": "B", "name": "Temperature t", "unit": "°C", "distribution": "rectangular", "sensitivity": -0.0011499344537358495, "half_width": 0.1 } ]

L₂₀ = L_t ÷ (1 + α(t − 20)) · Δ = L(α_x(t_x − 20) − α_s(t_s − 20)) · u(α) defaults to 10 % of α · 0 to 40 °C · presets are typical values; your α wins
Display rounding

Test vectors for this tool

The reference cases this calculator is tested against on every change. Use them to check your own software. All test vectors · Download JSON

IDInputsExpectedToleranceSource
TEX-01length = 100, temperature = 25, alpha = 0.0000115, unit = mm, output = length2099.994250330606 mm± 1e-11Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022).
TEX-02length = 100, temperature = 25, alpha = 0.0000115, unit = mm, output = linearized99.99425 mm± 1e-11Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022).
TEX-03length = 100, temperature = 25, alpha = 0.0000115, unit = mm, output = linearizationDifference3.3060599015556605e-7 mm± 1e-16Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022).
TEX-04length = 100, temperature = 25, alpha = 0.0000115, unit = mm, output = correction-0.0057496693940098445 mm± 1e-14Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022).
TEX-05length = 50, temperature = 20, alpha = 0.0000115, output = length2050 mm± 0Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022).
TEX-06length = 250, temperature = 18.5, alpha = 0.000023, unit = mm, output = length20250.00862529757276 mm± 1e-11Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022).
TEX-07length = 100, temperature = 25, alpha = 0.0000115, unit = mm, output = row:alpha:sensitivity-499.9425049589948 mm·K± 1e-10Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022).
TEX-08length = 100, temperature = 25, alpha = 0.0000115, unit = mm, output = row:alpha:contribution0.000574933880702844 mm± 1e-15Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022). u(α) is the 10 % default, a Metrology Bench convention; see the tool notes.
TEX-09length = 100, temperature = 25, alpha = 0.0000115, unit = mm, uTemperature = {"distribution":"rectangular","halfWidth":0.1}, output = row:t:contribution0.00006638764615800464 mm± 1e-15Hand-derived with exact rational arithmetic (Python fractions) from L₂₀ = L_t / (1 + α(t − 20)) (reference temperature 20 °C, ISO 1:2022).
TEX-10length = 25, unit = mm, uut = {"alpha":0.0000108,"temperature":21}, standard = {"alpha":0.0000115,"temperature":22}, standardLength = 25, reading = 0.0015, output = correction-0.000305 mm± 1e-15Hand-derived with exact rational arithmetic from the JCGM 100:2008 H.1 comparison model Δ = L(α_x(t_x − 20) − α_s(t_s − 20)), L_x = L_s + d − Δ.
TEX-11length = 25, unit = mm, uut = {"alpha":0.0000108,"temperature":21}, standard = {"alpha":0.0000115,"temperature":22}, standardLength = 25, reading = 0.0015, output = uutLength2025.001805 mm± 1e-12Hand-derived with exact rational arithmetic from the JCGM 100:2008 H.1 comparison model Δ = L(α_x(t_x − 20) − α_s(t_s − 20)), L_x = L_s + d − Δ.
TEX-12length = 25, unit = mm, uut = {"alpha":0.0000108,"temperature":21}, standard = {"alpha":0.0000115,"temperature":22,"uTemperature":{"distribution":"rectangular","halfWidth":0.2}}, standardLength = 25, reading = 0.0015, output = row:t_s:sensitivity0.0002875 mm/K± 1e-17Hand-derived with exact rational arithmetic from the JCGM 100:2008 H.1 comparison model Δ = L(α_x(t_x − 20) − α_s(t_s − 20)), L_x = L_s + d − Δ.
TEX-13length = 25, unit = mm, uut = {"alpha":0.0000108,"temperature":21}, standard = {"alpha":0.0000115,"temperature":22}, standardLength = 25, reading = 0.0015, output = row:alpha_x:sensitivity-25 mm·K± 1e-12Hand-derived with exact rational arithmetic from the JCGM 100:2008 H.1 comparison model Δ = L(α_x(t_x − 20) − α_s(t_s − 20)), L_x = L_s + d − Δ.
TEX-H1-01length = 50000000, unit = nm, model = difference, uut = {"alpha":0.0000115,"temperature":19.9,"uTemperature":{"distribution":"normal","halfWidth":0.406201920232,"k":1}}, standard = {"alpha":0.0000115,"temperature":19.9,"uAlpha":{"distribution":"rectangular","halfWidth":0.000002}}, uDeltaAlpha = {"distribution":"rectangular","halfWidth":0.000001,"dof":50}, uDeltaT = {"distribution":"rectangular","halfWidth":0.05,"dof":2}, output = row:delta_t:contribution16.5988202392 nm± 1e-9JCGM 100:2008 Annex H.1 end-gauge example (inputs as transcribed in MSL GTC examples/GUM_H1.py); expected value computed independently by GTC (github.com/MSLNZ/GTC, test/test_uncertain_real_dof.py, GuideExampleH1, commit 1c165fc). Checked against the printed JCGM 100:2008 H.1 values (Table H.1, H.1.3, H.1.6) on 2026-10-28.
TEX-H1-02length = 50000000, unit = nm, model = difference, uut = {"alpha":0.0000115,"temperature":19.9,"uTemperature":{"distribution":"normal","halfWidth":0.406201920232,"k":1}}, standard = {"alpha":0.0000115,"temperature":19.9,"uAlpha":{"distribution":"rectangular","halfWidth":0.000002}}, uDeltaAlpha = {"distribution":"rectangular","halfWidth":0.000001,"dof":50}, uDeltaT = {"distribution":"rectangular","halfWidth":0.05,"dof":2}, output = row:delta_alpha:contribution2.88675134595 nm± 1e-9JCGM 100:2008 Annex H.1 end-gauge example (inputs as transcribed in MSL GTC examples/GUM_H1.py); expected value computed independently by GTC (github.com/MSLNZ/GTC, test/test_uncertain_real_dof.py, GuideExampleH1, commit 1c165fc). Checked against the printed JCGM 100:2008 H.1 values (Table H.1, H.1.3, H.1.6) on 2026-10-28.
TEX-H1-03length = 50000000, unit = nm, model = difference, uut = {"alpha":0.0000115,"temperature":19.9,"uTemperature":{"distribution":"normal","halfWidth":0.406201920232,"k":1}}, standard = {"alpha":0.0000115,"temperature":19.9,"uAlpha":{"distribution":"rectangular","halfWidth":0.000002}}, uDeltaAlpha = {"distribution":"rectangular","halfWidth":0.000001,"dof":50}, uDeltaT = {"distribution":"rectangular","halfWidth":0.05,"dof":2}, output = row:alpha_s:contribution0 nm± 0JCGM 100:2008 Annex H.1 end-gauge example (inputs as transcribed in MSL GTC examples/GUM_H1.py); expected value computed independently by GTC (github.com/MSLNZ/GTC, test/test_uncertain_real_dof.py, GuideExampleH1, commit 1c165fc). Checked against the printed JCGM 100:2008 H.1 values (Table H.1, H.1.3, H.1.6) on 2026-10-28.
TEX-H1-04length = 50000000, unit = nm, model = difference, uut = {"alpha":0.0000115,"temperature":19.9,"uTemperature":{"distribution":"normal","halfWidth":0.406201920232,"k":1}}, standard = {"alpha":0.0000115,"temperature":19.9,"uAlpha":{"distribution":"rectangular","halfWidth":0.000002}}, uDeltaAlpha = {"distribution":"rectangular","halfWidth":0.000001,"dof":50}, uDeltaT = {"distribution":"rectangular","halfWidth":0.05,"dof":2}, extraRows = B normal U = 25 k = 1, ν = 18; B normal U = 5.8 k = 1, ν = 24; B normal U = 3.9 k = 1, ν = 5; B normal U = 6.7 k = 1, ν = 8, output = u_c31.6637674111 nm± 1e-8JCGM 100:2008 Annex H.1 end-gauge example (inputs as transcribed in MSL GTC examples/GUM_H1.py); expected value computed independently by GTC (github.com/MSLNZ/GTC, test/test_uncertain_real_dof.py, GuideExampleH1, commit 1c165fc). Checked against the printed JCGM 100:2008 H.1 values (Table H.1, H.1.3, H.1.6) on 2026-10-28.
TEX-H1-05length = 50000000, unit = nm, model = difference, uut = {"alpha":0.0000115,"temperature":19.9,"uTemperature":{"distribution":"normal","halfWidth":0.406201920232,"k":1}}, standard = {"alpha":0.0000115,"temperature":19.9,"uAlpha":{"distribution":"rectangular","halfWidth":0.000002}}, uDeltaAlpha = {"distribution":"rectangular","halfWidth":0.000001,"dof":50}, uDeltaT = {"distribution":"rectangular","halfWidth":0.05,"dof":2}, extraRows = B normal U = 25 k = 1, ν = 18; B normal U = 5.8 k = 1, ν = 24; B normal U = 3.9 k = 1, ν = 5; B normal U = 6.7 k = 1, ν = 8, output = nu_eff16.7521475092 ± 1e-7JCGM 100:2008 Annex H.1 end-gauge example (inputs as transcribed in MSL GTC examples/GUM_H1.py); expected value computed independently by GTC (github.com/MSLNZ/GTC, test/test_uncertain_real_dof.py, GuideExampleH1, commit 1c165fc). Checked against the printed JCGM 100:2008 H.1 values (Table H.1, H.1.3, H.1.6) on 2026-10-28.
TEX-RT-01length20 = 100, alpha = 0.0000115, temperature = 27.3100 mm± 1e-12Round trip: L₂₀ → L_t = L₂₀(1 + αθ) → L₂₀ = L_t/(1 + αθ). Exact inverse pair, so only floating point separates the result from the start.
TEX-RT-02length20 = 1000, alpha = 0.0000012, temperature = 4.51000 mm± 1e-11Round trip: L₂₀ → L_t = L₂₀(1 + αθ) → L₂₀ = L_t/(1 + αθ).
TEX-R-01length = 100, temperature = 41, alpha = 0.0000115, output = length20OutOfRangeError exactMetrology Bench limit 0 to 40 °C: a constant, room-temperature α (as presets and handbooks give) is a reasonable model only near 20 °C. ISO 1:2022 sets 20 °C as the reference.
TEX-R-02length = 100, temperature = -5, alpha = 0.0000115, output = length20OutOfRangeError exactMetrology Bench limit 0 to 40 °C (see TEX-R-01).
TEX-R-03length = 100, temperature = 25, alpha = 11.5, output = length20OutOfRangeError exactMetrology Bench limit |α| ≤ 1e-3 /K: no solid used for length work expands that much; a larger value is a unit slip.
TEX-R-04length = 50, model = difference, uut = {"alpha":0.0000115,"temperature":20.1}, standard = {"alpha":0.0000115,"temperature":20}, output = correctionRangeError exactJCGM 100:2008 H.1: the difference model takes u(δα) and u(δθ) as inputs; without them there is nothing to evaluate.
TEX-R-05length = 0, temperature = 25, alpha = 0.0000115, output = length20RangeError exactA length must be greater than zero.

Put this calculator on your site

Free for labs, schools and anyone else. Paste this into your page.

<iframe src="https://metrologybench.com/embed/thermal-expansion" title="Thermal expansion to 20 °C · Metrology Bench" width="100%" height="1100" style="border:0;max-width:640px" loading="lazy"></iframe>

Preview the embed

Ask your AI

Connect metrology-toolbox-mcp and your assistant runs this exact calculation, with the source in the answer.

Set it up