Tanaka (Recommended for Adults)
Fox & Haskell (Standard 220-Age)
Gulati (Optimized for Women)
Nes et al. (Active/Athletes)
Estimated Maximum Heart Rate
0 BPM
Formula: Tanaka
Comparison of Methods
Method
Formula
Result (BPM)
Your Training Zones
Based on the selected formula above.
Zone
Intensity
Range (BPM)
Benefit
How to Accurately Calculate Max Heart Rate
Your Maximum Heart Rate (MHR) is the highest number of beats per minute (BPM) your heart can pump under maximum stress. Determining this number is the cornerstone of effective heart rate training, allowing you to define specific zones for fat burning, endurance, and anaerobic capacity.
Medical Disclaimer: The calculations provided here are estimates based on population averages. Actual MHR can vary significantly (±10-12 BPM) due to genetics, fitness level, and medications. Always consult a physician before starting a high-intensity training program.
Why the "220 minus Age" Formula Isn't Always Enough
For decades, the standard formula of 220 – Age (Fox & Haskell) has been the go-to for gyms and fitness trackers. While simple, research has shown it often overestimates MHR for younger adults and underestimates it for older adults. To get a more accurate number without performing a laboratory stress test, researchers have developed updated regression equations.
Understanding the Formulas
1. The Tanaka Formula (Recommended)
Developed in 2001, this formula is widely considered more accurate for healthy adults across a broader age range.
Formula: 208 – (0.7 × Age)
Best For: General population, healthy adults.
2. The Gulati Formula (For Women)
Research published in 2010 demonstrated that women often have a different physiological response to maximal exercise than men. The Gulati formula adjusts for this difference.
Formula: 206 – (0.88 × Age)
Best For: Women seeking more precision than the standard calculation.
3. The Nes Formula (For Active Individuals)
Based on the HUNT Fitness Study, this formula tends to be more accurate for people who are already active or have a higher level of cardiovascular fitness.
Formula: 211 – (0.64 × Age)
Best For: Athletes and active individuals.
Heart Rate Training Zones Explained
Once you have your MHR, you can target specific biological adaptations by training in these zones:
Zone 1 (50-60%): Warm Up / Recovery. Used for warming up or active recovery days. Promotes blood flow and recovery.
Zone 2 (60-70%): Fat Burning / Base. The "conversational" pace. This zone teaches your body to utilize fat as fuel and builds mitochondrial efficiency.
Zone 3 (70-80%): Aerobic Endurance. Improves blood circulation and skeletal muscle efficiency. Moderate sweating and deeper breathing.
Zone 4 (80-90%): Hardcore / Anaerobic. Increases performance speed and lactate threshold. Breathing becomes heavy; sustainable for shorter periods.
Zone 5 (90-100%): Maximum Effort. Used for interval training (HIIT). Develops speed and neuromuscular power. Only sustainable for very short bursts.
How to Use This Data
To use these numbers effectively, invest in a chest strap heart rate monitor (more accurate than wrist-based optical sensors) and aim to keep your average heart rate within the specific range for the duration of your workout type. For example, a "long slow run" should be strictly in Zone 2, while sprint intervals will spike into Zone 5 with Zone 1 recovery periods.
function calculateMHR() {
// 1. Get Inputs
var ageInput = document.getElementById("calcAge");
var genderSelect = document.getElementById("calcGender");
var formulaSelect = document.getElementById("calcFormula");
var age = parseFloat(ageInput.value);
var gender = genderSelect.value;
var preferredFormula = formulaSelect.value;
// 2. Validation
if (isNaN(age) || age 120) {
alert("Please enter a valid age between 1 and 120.");
return;
}
// 3. Calculate MHR using different formulas
// Tanaka: 208 – (0.7 * age)
var mhrTanaka = Math.round(208 – (0.7 * age));
// Fox (Standard): 220 – age
var mhrFox = Math.round(220 – age);
// Gulati (Women): 206 – (0.88 * age)
var mhrGulati = Math.round(206 – (0.88 * age));
// Nes (Active): 211 – (0.64 * age)
var mhrNes = Math.round(211 – (0.64 * age));
// 4. Determine Primary Result based on selection
var primaryMHR = 0;
var formulaName = "";
if (preferredFormula === "tanaka") {
primaryMHR = mhrTanaka;
formulaName = "Tanaka (208 – 0.7 × Age)";
} else if (preferredFormula === "fox") {
primaryMHR = mhrFox;
formulaName = "Fox & Haskell (220 – Age)";
} else if (preferredFormula === "gulati") {
primaryMHR = mhrGulati;
formulaName = "Gulati (206 – 0.88 × Age)";
} else if (preferredFormula === "nes") {
primaryMHR = mhrNes;
formulaName = "Nes et al. (211 – 0.64 × Age)";
}
// 5. Update UI – Primary Result
document.getElementById("displayMHR").innerHTML = primaryMHR + " BPM";
document.getElementById("formulaUsed").innerText = "Based on: " + formulaName;
// 6. Update UI – Comparison Table
var compTable = document.getElementById("comparisonTableBody");
compTable.innerHTML = "";
// Helper to add row
function addCompRow(name, formula, val) {
var row = "
" + name + "
" + formula + "
" + val + "
";
return row;
}
compTable.innerHTML += addCompRow("Tanaka (Adults)", "208 – 0.7 × Age", mhrTanaka);
compTable.innerHTML += addCompRow("Fox (Standard)", "220 – Age", mhrFox);
compTable.innerHTML += addCompRow("Nes (Active)", "211 – 0.64 × Age", mhrNes);
// Only show Gulati for everyone or highlight it? Let's show it but note it's for women
if (gender === "female") {
compTable.innerHTML += addCompRow("Gulati (Women)", "206 – 0.88 × Age", mhrGulati);
} else {
compTable.innerHTML += addCompRow("Gulati (Ref for Women)", "206 – 0.88 × Age", mhrGulati);
}
// 7. Update UI – Zones Table (Using Primary Result)
var zonesTable = document.getElementById("zonesTableBody");
zonesTable.innerHTML = "";
var zones = [
{ id: "z1", name: "Zone 1", label: "Recovery", min: 0.50, max: 0.60, ben: "Warm up, recovery, blood flow" },
{ id: "z2", name: "Zone 2", label: "Fat Burn", min: 0.60, max: 0.70, ben: "Fat metabolism, endurance base" },
{ id: "z3", name: "Zone 3", label: "Aerobic", min: 0.70, max: 0.80, ben: "Cardiovascular capacity" },
{ id: "z4", name: "Zone 4", label: "Anaerobic", min: 0.80, max: 0.90, ben: "Lactate threshold, speed" },
{ id: "z5", name: "Zone 5", label: "Maximum", min: 0.90, max: 1.00, ben: "Max effort, neuromuscular power" }
];
for (var i = 0; i < zones.length; i++) {
var z = zones[i];
var rangeMin = Math.round(primaryMHR * z.min);
var rangeMax = Math.round(primaryMHR * z.max);
var badgeClass = "zone-badge " + z.id;
var rowHTML = "