Heart Rate Zones (HRR) Calculator
Age (Years)
Resting Heart Rate (BPM)
Calculate Training Zones
Please enter valid age and resting heart rate values.
Estimated Max HR: BPM
Heart Rate Reserve (HRR): BPM
Zone
Intensity
Target Range (BPM)
Understanding Heart Rate Reserve (HRR)
Heart Rate Reserve (HRR) is the difference between your measured or predicted maximum heart rate and your resting heart rate. Unlike simple percentage methods that only use maximum heart rate, the Karvonen Formula used here incorporates your resting heart rate, providing a more personalized and accurate representation of your cardiovascular fitness levels.
The Karvonen Formula Explained
The formula to calculate your Target Heart Rate (THR) for a specific intensity percentage is:
THR = [(Max HR − Resting HR) × %Intensity] + Resting HR
What the Training Zones Mean
Zone 1 (50-60%): Very Light. Great for warm-ups, cool-downs, and recovery. Improves overall health but offers low cardiovascular strain.
Zone 2 (60-70%): Light. Known as the "fat-burning" zone. Builds basic endurance and metabolic efficiency.
Zone 3 (70-80%): Moderate. The aerobic zone. Improves blood circulation and strengthens the heart and lungs.
Zone 4 (80-90%): Hard. The anaerobic zone. Enhances speed, power, and high-intensity endurance. You will feel breathless here.
Zone 5 (90-100%): Maximum. Sprinting and peak performance. Only sustainable for very short durations.
Example Calculation
If you are 40 years old with a resting heart rate of 60 BPM:
Max HR: 220 – 40 = 180 BPM
HRR: 180 – 60 = 120 BPM
60% Intensity: (120 x 0.60) + 60 = 132 BPM
70% Intensity: (120 x 0.70) + 60 = 144 BPM
Zone 2 Range: 132 to 144 BPM
function calculateHRR() {
var age = parseFloat(document.getElementById("ageInput").value);
var rhr = parseFloat(document.getElementById("restingHR").value);
var errorMsg = document.getElementById("error-msg");
var resultsDiv = document.getElementById("results-container");
var tableBody = document.getElementById("zoneTableBody");
// Reset UI
errorMsg.style.display = "none";
resultsDiv.style.display = "none";
tableBody.innerHTML = "";
// Validation
if (isNaN(age) || age 120 || isNaN(rhr) || rhr 220) {
errorMsg.style.display = "block";
return;
}
// Formulas
var maxHR = 220 – age;
var hrr = maxHR – rhr;
if (hrr <= 0) {
errorMsg.innerText = "Resting HR cannot be higher than Max HR. Please check your inputs.";
errorMsg.style.display = "block";
return;
}
document.getElementById("maxHRVal").innerText = Math.round(maxHR);
document.getElementById("hrrVal").innerText = Math.round(hrr);
var zones = [
{ name: "Zone 1", label: "Very Light", low: 0.50, high: 0.60, color: "#95a5a6" },
{ name: "Zone 2", label: "Light (Endurance)", low: 0.60, high: 0.70, color: "#2ecc71" },
{ name: "Zone 3", label: "Moderate (Aerobic)", low: 0.70, high: 0.80, color: "#f1c40f" },
{ name: "Zone 4", label: "Hard (Anaerobic)", low: 0.80, high: 0.90, color: "#e67e22" },
{ name: "Zone 5", label: "Maximum (Performance)", low: 0.90, high: 1.00, color: "#e74c3c" }
];
var html = "";
for (var i = 0; i < zones.length; i++) {
var z = zones[i];
var lowBpm = Math.round((hrr * z.low) + rhr);
var highBpm = Math.round((hrr * z.high) + rhr);
html += "
";
html += "" + z.name + " ";
html += "" + z.label + " (" + (z.low * 100) + "-" + (z.high * 100) + "%) ";
html += "" + lowBpm + " – " + highBpm + " BPM ";
html += " ";
}
tableBody.innerHTML = html;
resultsDiv.style.display = "block";
}