Enter for greater accuracy (Karvonen Method). Leave blank for Standard Method.
Estimated Max Heart Rate
0 BPM
Zone / Intensity
Range
BPM Target
What is the formula for calculating heart rate?
Understanding the formula for calculating heart rate is essential for designing safe and effective exercise programs. The two primary metrics used in fitness are the **Maximum Heart Rate (MHR)** and the **Target Heart Rate (THR)** zones.
1. The Maximum Heart Rate Formula
The most widely accepted standard for estimating maximum heart rate is the age-based subtraction formula. While there are slight variations, the most common formula used in cardiology and fitness is:
MHR = 220 – Age
For example, if you are 40 years old, your estimated maximum heart rate is 220 – 40 = 180 beats per minute (bpm).
2. The Karvonen Formula (Heart Rate Reserve)
While the standard percentage method is simple, it doesn't account for individual fitness levels. The Karvonen Formula is considered more accurate because it incorporates your Resting Heart Rate (RHR).
The logic is that a fitter person has a lower resting heart rate and a larger "Heart Rate Reserve" to utilize during exercise.
Zone 1 (50-60%): Very Light. For warm-ups and recovery.
Zone 2 (60-70%): Light. Improves basic endurance and fat burning.
Zone 3 (70-80%): Moderate. Improves aerobic fitness and blood circulation.
Zone 4 (80-90%): Hard. Increases maximum performance capacity.
Zone 5 (90-100%): Maximum. Develops maximum speed and sprinting power (short bursts).
function calculateZones() {
var ageInput = document.getElementById('hr-age').value;
var rhrInput = document.getElementById('hr-resting').value;
var resultDiv = document.getElementById('hr-results');
var mhrDisplay = document.getElementById('display-mhr');
var zonesBody = document.getElementById('zones-body');
var methodNote = document.getElementById('method-note');
// Validation
if (!ageInput || isNaN(ageInput) || ageInput 120) {
alert("Please enter a valid age between 1 and 120.");
return;
}
var age = parseInt(ageInput);
var mhr = 220 – age;
// Check if Resting HR is provided and valid
var rhr = 0;
var useKarvonen = false;
if (rhrInput && !isNaN(rhrInput) && rhrInput > 30 && rhrInput < 200) {
rhr = parseInt(rhrInput);
useKarvonen = true;
}
// Display Max Heart Rate
mhrDisplay.innerHTML = mhr + " BPM";
resultDiv.style.display = "block";
// Zone Definitions
var zones = [
{ name: "Zone 5 (Maximum)", class: "zone-5", desc: "90% – 100%", minPct: 0.9, maxPct: 1.0 },
{ name: "Zone 4 (Hard)", class: "zone-4", desc: "80% – 90%", minPct: 0.8, maxPct: 0.9 },
{ name: "Zone 3 (Moderate)",class: "zone-3", desc: "70% – 80%", minPct: 0.7, maxPct: 0.8 },
{ name: "Zone 2 (Light)", class: "zone-2", desc: "60% – 70%", minPct: 0.6, maxPct: 0.7 },
{ name: "Zone 1 (Warm Up)", class: "zone-1", desc: "50% – 60%", minPct: 0.5, maxPct: 0.6 }
];
var tableHtml = "";
for (var i = 0; i < zones.length; i++) {
var z = zones[i];
var minBpm, maxBpm;
if (useKarvonen) {
// Karvonen Formula: ((MHR – RHR) * %) + RHR
var hrr = mhr – rhr;
minBpm = Math.round((hrr * z.minPct) + rhr);
maxBpm = Math.round((hrr * z.maxPct) + rhr);
} else {
// Standard Formula: MHR * %
minBpm = Math.round(mhr * z.minPct);
maxBpm = Math.round(mhr * z.maxPct);
}
tableHtml += "
";
tableHtml += "
" + z.name + "
";
tableHtml += "
" + z.desc + "
";
tableHtml += "
" + minBpm + " – " + maxBpm + " BPM
";
tableHtml += "
";
}
zonesBody.innerHTML = tableHtml;
if (useKarvonen) {
methodNote.innerHTML = "Calculated using the Karvonen Formula (accounting for resting heart rate).";
} else {
methodNote.innerHTML = "Calculated using the Standard Age-Predicted Formula. Enter Resting HR for Karvonen method.";
}
}