Optimize your athletic performance with precise heart rate zone training.
Male
Female
Enter for Karvonen Method accuracy (recommended for athletes).
Your Estimated Maximum Heart Rate
0 BPM
Based on the Tanaka Formula.
Heart Rate Training Zones
Zone
Intensity
Heart Rate Range (BPM)
Training Benefit
Why Accurate Heart Rate Calculations Matter for Athletes
For athletes seeking peak performance, the generic "220 minus age" formula is often insufficient. It does not account for individual physiological differences, gender, or resting heart rate efficiency gained through training. This calculator utilizes the Tanaka Formula (208 – 0.7 × age) and the Gulati Formula (for women), which are widely considered more accurate for active individuals.
Pro Tip: If you input your Resting Heart Rate (RHR), this calculator automatically switches to the Karvonen Method. This calculates your Heart Rate Reserve (HRR) to determine training zones, providing a significantly more personalized training plan that accounts for your fitness level.
Understanding the Training Zones
Zone 1 (Recovery / Warm-up): Very light intensity. Used for warming up or active recovery days to clear metabolic waste.
Zone 2 (Aerobic Base): The "sweet spot" for endurance. Trains the body to burn fat as fuel and builds capillary density. Marathon runners spend much of their time here.
Zone 3 (Tempo / Aerobic): Improves blood circulation and skeletal muscle efficiency. Often described as "comfortably hard."
Zone 4 (Lactate Threshold): Hard effort. Increases maximum performance capacity and pushes the lactate threshold up, allowing you to sustain speed for longer.
Zone 5 (VO2 Max / Anaerobic): Maximum effort. Sustainable only for very short bursts. Increases fast-twitch muscle fibers and speed.
How to Measure Resting Heart Rate
To get the most accurate results from the calculator above:
Measure your pulse immediately after waking up, before getting out of bed.
Count the beats for 60 seconds (or 15 seconds multiplied by 4).
Repeat this for 3 days and take the average.
Disclaimer: This calculator provides estimates. For precise medical data or before starting a rigorous training program, consult a sports cardiologist or undergo a clinical stress test.
function calculateAthleteMHR() {
// 1. Get Inputs
var ageInput = document.getElementById('athleteAge');
var genderInput = document.getElementById('athleteGender');
var rhrInput = document.getElementById('restingHR');
var resultDiv = document.getElementById('mhrResult');
var maxHRDisplay = document.getElementById('maxHRValue');
var formulaDisplay = document.getElementById('formulaName');
var tableBody = document.getElementById('zonesTableBody');
var methodText = document.getElementById('methodUsedText');
var age = parseFloat(ageInput.value);
var gender = genderInput.value;
var rhr = parseFloat(rhrInput.value);
// 2. Validation
if (isNaN(age) || age 100) {
alert("Please enter a valid age between 10 and 100.");
return;
}
// 3. Calculate Max Heart Rate (MHR)
var maxHR = 0;
var formulaUsed = "";
if (gender === 'female') {
// Gulati Formula for women: 206 – (0.88 * age)
maxHR = 206 – (0.88 * age);
formulaUsed = "Gulati (Women's Specific)";
} else {
// Tanaka Formula for men/general active: 208 – (0.7 * age)
maxHR = 208 – (0.7 * age);
formulaUsed = "Tanaka (Active/Athletic)";
}
maxHR = Math.round(maxHR);
// 4. Calculate Zones
// Check if Resting Heart Rate is provided for Karvonen Method
var useKarvonen = !isNaN(rhr) && rhr > 20 && rhr < maxHR;
var zones = [];
if (useKarvonen) {
// Karvonen Formula: Target HR = ((Max HR – Resting HR) * %Intensity) + Resting HR
var hrr = maxHR – rhr; // Heart Rate Reserve
methodText.innerHTML = "Zones calculated using the Karvonen Method (Heart Rate Reserve), incorporating your resting heart rate for higher accuracy.";
zones = [
{ name: "Zone 1", label: "Recovery", minPct: 0.50, maxPct: 0.60, benefit: "Warm up, recovery, fat burn" },
{ name: "Zone 2", label: "Aerobic Base", minPct: 0.60, maxPct: 0.70, benefit: "Endurance, stamina, fat metabolism" },
{ name: "Zone 3", label: "Tempo", minPct: 0.70, maxPct: 0.80, benefit: "Aerobic capacity, blood circulation" },
{ name: "Zone 4", label: "Threshold", minPct: 0.80, maxPct: 0.90, benefit: "High speed endurance, lactate tolerance" },
{ name: "Zone 5", label: "VO2 Max", minPct: 0.90, maxPct: 1.00, benefit: "Max power, speed, muscle reaction" }
];
// Calculation loop for Karvonen
for (var i = 0; i < zones.length; i++) {
zones[i].minBPM = Math.round((hrr * zones[i].minPct) + rhr);
zones[i].maxBPM = Math.round((hrr * zones[i].maxPct) + rhr);
}
} else {
// Simple Percentage of Max HR
methodText.innerHTML = "Zones calculated using Percentage of Max Heart Rate. Enter Resting HR for Karvonen precision.";
zones = [
{ name: "Zone 1", label: "Very Light", minPct: 0.50, maxPct: 0.60, benefit: "Warm up, recovery" },
{ name: "Zone 2", label: "Light", minPct: 0.60, maxPct: 0.70, benefit: "Fat burning, basic endurance" },
{ name: "Zone 3", label: "Moderate", minPct: 0.70, maxPct: 0.80, benefit: "Aerobic fitness" },
{ name: "Zone 4", label: "Hard", minPct: 0.80, maxPct: 0.90, benefit: "Max performance capacity" },
{ name: "Zone 5", label: "Maximum", minPct: 0.90, maxPct: 1.00, benefit: "Sprint speed" }
];
// Calculation loop for Simple %
for (var j = 0; j < zones.length; j++) {
zones[j].minBPM = Math.round(maxHR * zones[j].minPct);
zones[j].maxBPM = Math.round(maxHR * zones[j].maxPct);
}
}
// 5. Update DOM
maxHRDisplay.innerText = maxHR;
formulaDisplay.innerText = formulaUsed;
// Clear previous table rows
tableBody.innerHTML = "";
// Populate table
for (var k = 0; k < zones.length; k++) {
var row = document.createElement('tr');
// Cells
var cellZone = document.createElement('td');
cellZone.innerHTML = "" + zones[k].name + "";
var cellLabel = document.createElement('td');
cellLabel.innerText = zones[k].label + " (" + Math.round(zones[k].minPct*100) + "-" + Math.round(zones[k].maxPct*100) + "%)";
var cellRange = document.createElement('td');
cellRange.innerText = zones[k].minBPM + " – " + zones[k].maxBPM + " bpm";
var cellBenefit = document.createElement('td');
cellBenefit.innerText = zones[k].benefit;
row.appendChild(cellZone);
row.appendChild(cellLabel);
row.appendChild(cellRange);
row.appendChild(cellBenefit);
tableBody.appendChild(row);
}
// Show results
resultDiv.style.display = "block";
// Scroll to results
resultDiv.scrollIntoView({behavior: "smooth"});
}