TL;DR
- For a 40:00 10K, the Riegel-based race-time predictor projects a half-marathon of 1:28:15 at a baseline pace of 4:00/km.[4]
- The VDOT engine returns VDOT 51.9 and a half-marathon equivalent of 1:28:33 — only about 18 seconds slower than the Riegel prediction.[2]
- The headline result is agreement, not disagreement. Over a 21 km race, two formulas built from completely different data land within 0.3% of each other.
- Where they diverge is the marathon, not the half. The spread grows to about 38 seconds at 42.195 km and keeps widening past it — the further you extrapolate, the less the two agree.
A 40-flat 10K is the most common "what next?" entry point in recreational running. The Riegel formula and Daniels' VDOT system both project a half-marathon time from it, and they are often assumed to disagree by a minute or more. This is the head-to-head comparison entry in our race-prediction series: it runs both engines on the same input and reads the actual gap — which turns out to be far smaller than the folklore suggests.
Engine outputs
A 40:00 10K through the Riegel-based Race Time Predictor and the Daniels Run Training Paces Calculator (VDOT):
# race-time-predictor (computed live from /engines/race-time-predictor.js)
Engine input
known_distance_km = 10
known_time_minutes = 40
Engine output
predictions[0].label = 5K
predictions[0].distanceKm= 5
predictions[0].timeMinutes= 19.185282386505286
predictions[0].paceMinPerKm= 3.837056477301057
predictions[0].paceMinPerMile= 6.1751438194055925
predictions[0].difficultyDelta= 0.9592641193252642
predictions[1].label = 10K
predictions[1].distanceKm= 10
predictions[1].timeMinutes= 40
predictions[1].paceMinPerKm= 4
predictions[1].paceMinPerMile= 6.437376
predictions[1].difficultyDelta= 1
predictions[2].label = Half Marathon
predictions[2].distanceKm= 21.0975
predictions[2].timeMinutes= 88.25612324274093
predictions[2].paceMinPerKm= 4.1832503018244305
predictions[2].paceMinPerMile= 6.732288773739337
predictions[2].difficultyDelta= 1.0458125754561076
predictions[3].label = Marathon
predictions[3].distanceKm= 42.195
predictions[3].timeMinutes= 184.00797333026344
predictions[3].paceMinPerKm= 4.360895208680257
predictions[3].paceMinPerMile= 7.018180538718321
predictions[3].difficultyDelta= 1.0902238021700643
baselinePaceMinPerKm = 4
baselinePaceMinPerMile= 6.437376 # run-training-paces-calculator (computed live from /engines/run-training-paces-calculator.js)
Engine input
distance = 10k
race_time_minutes = 40
race_time_seconds = 0
Engine output
vdot = 51.9
inputRaceDistanceMeters= 10000
inputRaceTimeSeconds = 2400
inputPacePerKmSeconds = 240
zones[0].zone = E
zones[0].label = Easy / Long Run
zones[0].description = Conversational pace for aerobic base and recovery. Use for most training volume.
zones[0].pacePerKmSeconds= 308
zones[0].pacePerMileSeconds= 496
zones[0].effortPercent= 67
zones[1].zone = M
zones[1].label = Marathon Pace
zones[1].description = Comfortably hard. Race-specific feel for marathon training runs.
zones[1].pacePerKmSeconds= 270
zones[1].pacePerMileSeconds= 435
zones[1].effortPercent= 79
zones[2].zone = T
zones[2].label = Threshold / Tempo
zones[2].description = Comfortably hard sustained effort. Improves lactate threshold. Max 20 min continuous.
zones[2].pacePerKmSeconds= 252
zones[2].pacePerMileSeconds= 406
zones[2].effortPercent= 86
zones[3].zone = I
zones[3].label = Interval / VO₂max
zones[3].description = Hard 3–5 min repeats near VO₂max. Builds aerobic power. Typical rep: 800m–1200m.
zones[3].pacePerKmSeconds= 228
zones[3].pacePerMileSeconds= 366
zones[3].effortPercent= 98
zones[4].zone = R
zones[4].label = Repetition / Speed
zones[4].description = Short fast reps (200m–400m) with full recovery. Develops economy and speed.
zones[4].pacePerKmSeconds= 206
zones[4].pacePerMileSeconds= 332
zones[4].effortPercent= 110
equivalentRaceTimes[0].distance= 1,500m
equivalentRaceTimes[0].distanceMeters= 1500
equivalentRaceTimes[0].predictedSeconds= 313
equivalentRaceTimes[1].distance= 1 Mile
equivalentRaceTimes[1].distanceMeters= 1609.34
equivalentRaceTimes[1].predictedSeconds= 338
equivalentRaceTimes[2].distance= 5K
equivalentRaceTimes[2].distanceMeters= 5000
equivalentRaceTimes[2].predictedSeconds= 1158
equivalentRaceTimes[3].distance= 10K
equivalentRaceTimes[3].distanceMeters= 10000
equivalentRaceTimes[3].predictedSeconds= 2400
equivalentRaceTimes[4].distance= Half Marathon
equivalentRaceTimes[4].distanceMeters= 21097.5
equivalentRaceTimes[4].predictedSeconds= 5313
equivalentRaceTimes[5].distance= Marathon
equivalentRaceTimes[5].distanceMeters= 42195
equivalentRaceTimes[5].predictedSeconds= 11078 Riegel's T2 = T1 × (D2/D1)^1.06: 40 × (21.0975/10)^1.06 ≈ 88.26 minutes (1:28:15) for the half, 184.0 minutes (3:04:00) for the marathon, and 19.19 minutes (19:11) for the 5K.[1]
A 40:00 10K maps to VDOT 51.9, whose Daniels-table half-marathon equivalent is 1:28:33 (5313 s) and marathon equivalent 3:04:38 (11078 s). The VDOT pace zones come back as E 5:08/km, M 4:30/km, T 4:12/km, I 3:48/km, R 3:26/km.[2]
Reading the 18-second gap
The interesting result is how close these two engines land. Riegel projects 1:28:15; VDOT projects 1:28:33. The spread is 18 seconds over a 21.1 km race — roughly 0.3% of the total time. Two models built from entirely different source data (Riegel from world-record times across distances, Daniels from trained club and collegiate runners) converge almost exactly at the half-marathon distance for a runner in this fitness band.
That convergence is not an accident. The half-marathon sits close to the 10K input on a logarithmic distance scale, so both engines are doing a short, well-conditioned extrapolation. Riegel's 1.06 exponent and Daniels' VDOT tables were both calibrated against trained-runner data in exactly this range, so they agree where the underlying physiology is best characterised.[3]
Where the spread actually grows: the marathon
Extend the same input to 42.195 km and the agreement loosens. Riegel projects 3:04:00; VDOT projects 3:04:38. The spread widens from 18 seconds at the half to about 38 seconds at the full marathon. The pattern is consistent: the further past the input distance you extrapolate, the more the two models diverge, with VDOT trending slightly slower (more conservative) at long distances.
Distance Riegel VDOT Spread
──────────────────────────────────────────────
5K 19:11 19:18 +7 s (VDOT slower)
10K (input) 40:00 40:00 0 s
Half Marathon 1:28:15 1:28:33 +18 s
Marathon 3:04:00 3:04:38 +38 s This is the honest reading of the two engines: they agree closely near the input distance and drift apart as you extrapolate further. At the half-marathon — the most common target off a 10K — the practical difference is negligible, well inside the noise of race-day pacing, weather, and course profile.
When the small gap still matters
Eighteen seconds is inside the margin where the runner, not the formula, decides the outcome. Use the two predictions as a tight bracket rather than rival forecasts:
- VDOT (1:28:33) as the conservative anchor. Slightly slower, which makes it the safer pacing target for a first half-marathon attempt.
- Riegel (1:28:15) as the stretch target. For a well-trained 10K runner with consistent half-marathon mileage, the slightly faster figure is reachable on a good day.
- Either, for training zones. The difference is too small to change session prescription. Use VDOT's pace bands because it returns them directly.
How the two models differ in structure
The numbers agree, but the engines are built differently — worth knowing for cases where they don't:
- Continuous function vs table. Riegel is one scalable exponent (1.06), applicable to any distance. VDOT is a piecewise table-driven mapping. Inside the well-fitted range they track each other; far outside it they can drift apart.
- Pace zones vs single race time. VDOT returns training zones (Easy / Marathon / Threshold / Interval / Reps) plus race equivalents, which is more useful for actual training. Riegel returns equivalent times only.
- Extrapolation behaviour. Riegel's flat exponent applies the same fatigue assumption at every distance. VDOT's table bends slightly more at long distances, which is why the spread widens toward the marathon rather than the half.
When to use which
Practical guidance:
- For a half-marathon goal pace off a 10K personal best, treat the two outputs as one answer — they agree to within 18 seconds. Pick VDOT as the conservative pacing number and run.
- For setting training zones, use VDOT directly — the pace bands map cleanly onto session intensities. The Run Training Paces Calculator exposes them.
- For predicting a marathon from a 10K, expect the engines to start disagreeing (about 38 seconds here) and both to lose accuracy. Verify with a marathon-paced training block, not a 4× distance extrapolation.
- For hilly courses, neither tool handles elevation; pair them with the Marathon Pace Elevation tool which adds the slope correction.
The runner the engines were built for
Both models were derived from competitive-runner data: Riegel from world-record times across distances, VDOT from a population of trained club and collegiate runners. The 40-minute 10K runner (VDOT 51.9) sits in the heart of the cohort both models were fit to, which is exactly why they agree so closely here. For runners well outside that range — beginners over 60 minutes, sub-elites under 32 minutes — both engines lose precision in different directions, and the half-marathon spread can open up well beyond 18 seconds.[2]
The Race Time Predictor exposes the Riegel exponent as a tunable parameter (default 1.06). For under-trained runners, raising the exponent to 1.10–1.12 makes Riegel more conservative at the half-marathon distance, pushing it past the VDOT prediction.
Related in this series
- Race Time Prediction: Riegel and Its Limits — the prediction pillar: where the formula comes from.
- VDOT vs Riegel: Failure Modes — where the two models disagree and mislead.
- Predicting a Half-Marathon From a 40-Minute 10K — worked example through the Riegel engine.
- Training Paces From a 3:15 Marathon PR — turning a predicted time into VDOT/McMillan training zones.
Beyond the series: How To Train For A 5K covers the volume-vs-intensity framing that determines which engine wins on race day, and the Running Pace Calculator converts goal times back into per-kilometre paces.
FAQ
Which prediction should I aim for on race day?
For the half-marathon the two are 18 seconds apart, so it barely matters. Aim for the VDOT figure (1:28:33) as the conservative target; if the race goes well you'll naturally drift toward the Riegel time (1:28:15). The gap is smaller than the swing a single hill or a warm afternoon will cause.
What's the right Riegel exponent for me?
The default 1.06 fits trained runners well and produces a half-marathon prediction within 18 seconds of VDOT for a 40:00 10K. For lower training volume (under 50 km/week), raise it to 1.08–1.10 to make the prediction more conservative; for low-mileage runners (under 35 km/week), 1.12 is reasonable.[3]
Does heat change which engine wins?
Neither engine adjusts for heat — both were calibrated on temperate-condition races. Above 20°C, both over-predict by roughly 2–5%. A common pacing rule is to add about 1% to the predicted time per 5°C above 15°C, applied to whichever engine you picked.
Why does VDOT include training paces but Riegel doesn't?
Daniels designed VDOT explicitly as a training-prescription system; Riegel designed his formula as a race-time extrapolation tool. The difference reflects intent, not theoretical depth. Use VDOT when the next step is a training block, use Riegel when the next step is a goal time on the race calendar.
References
- 1 Athletic records and human endurance (Riegel) — American Scientist (PubMed PMID 7235349) (1981)
- 2 Daniels' Running Formula and the VDOT system: a critical review — Sports Medicine (2003)
- 3 Modelling endurance performance from race time data (Vandewalle et al.) — European Journal of Applied Physiology (2016)
- 4 Methodology notes for the Race Time Predictor — AI Fit Hub (2026)