Why Use a Max Heart Rate Calculator with Resting Heart Rate?
Most generic heart rate calculators only use your age to determine your training zones. While the standard "220 minus age" formula gives a rough estimate of your Maximum Heart Rate (MHR), it fails to account for your individual fitness level.
This calculator utilizes the Karvonen Method. By incorporating your Resting Heart Rate (RHR) into the equation, we calculate your "Heart Rate Reserve" (HRR). This provides a much more personalized and accurate set of training zones tailored to your current cardiovascular health.
The Math Behind the Karvonen Formula
Unlike simple linear equations, the Karvonen formula determines target intensity based on the difference between your maximum and resting capability. The formula used is:
Training in specific heart rate zones allows you to target different physiological adaptations. Here is what the zones calculated above represent:
Zone 1: Very Light (50-60%)
Used for warm-ups, cool-downs, and active recovery. This zone improves overall health and helps with recovery after hard training days.
Zone 2: Light / Fat Burn (60-70%)
The "conversational" pace. This is the optimal zone for building basic endurance and burning fat. Marathon runners spend a lot of time here.
Zone 3: Moderate / Aerobic (70-80%)
Improves aerobic fitness and blood circulation in skeletal muscles. Training here starts to feel harder; you will breathe heavier but can still speak in short sentences.
Zone 4: Hard / Threshold (80-90%)
This increases maximum performance capacity. You are training your body to tolerate higher levels of lactic acid. It is hard to maintain this intensity for long periods.
Zone 5: Maximum (90-100%)
This is your peak effort, used for short intervals. It develops maximum speed and neuromuscular power. Sustainable for only very short bursts.
How to Measure Resting Heart Rate
To get the most accurate result from this calculator, measure your pulse immediately after waking up, before you sit up in bed. Count the beats for 60 seconds. Do this for 3-5 days and take the average.
function calculateHeartRateZones() {
// 1. Get Input Values
var ageInput = document.getElementById('hr-age');
var rhrInput = document.getElementById('hr-resting');
var age = parseFloat(ageInput.value);
var rhr = parseFloat(rhrInput.value);
// 2. Validate Inputs
if (isNaN(age) || age 120) {
alert("Please enter a valid age between 1 and 120.");
return;
}
if (isNaN(rhr) || rhr 200) {
alert("Please enter a valid resting heart rate (typically between 30 and 150).");
return;
}
// 3. Calculation Logic (Karvonen Method)
var mhr = 220 – age; // Standard max heart rate formula
// Safety check: Resting cannot be higher than Max
if (rhr >= mhr) {
alert("Your Resting Heart Rate cannot be higher than or equal to your estimated Max Heart Rate (" + mhr + "). Please check your inputs.");
return;
}
var hrr = mhr – rhr; // Heart Rate Reserve
// 4. Define Zones
// Function to calc specific intensity
function getZone(percentage) {
return Math.round((hrr * percentage) + rhr);
}
// Zone boundaries
var z1_min = getZone(0.50);
var z1_max = getZone(0.60);
var z2_min = getZone(0.60);
var z2_max = getZone(0.70);
var z3_min = getZone(0.70);
var z3_max = getZone(0.80);
var z4_min = getZone(0.80);
var z4_max = getZone(0.90);
var z5_min = getZone(0.90);
var z5_max = getZone(1.00); // Should equal MHR ideally, slightly adjusted by rounding logic but we use calculated logic
// 5. Display Summary Results
document.getElementById('res-mhr').innerText = mhr;
document.getElementById('res-hrr').innerText = hrr;
// 6. Populate Table
var tbody = document.getElementById('res-table-body');
tbody.innerHTML = "; // Clear previous
var zones = [
{
name: "Zone 5",
cls: "z5",
pct: "90-100%",
range: z5_min + " – " + mhr,
benefit: "Maximum Performance & Speed"
},
{
name: "Zone 4",
cls: "z4",
pct: "80-90%",
range: z4_min + " – " + (z4_max – 1),
benefit: "Increases Max Performance Capacity"
},
{
name: "Zone 3",
cls: "z3",
pct: "70-80%",
range: z3_min + " – " + (z3_max – 1),
benefit: "Improves Aerobic Fitness"
},
{
name: "Zone 2",
cls: "z2",
pct: "60-70%",
range: z2_min + " – " + (z2_max – 1),
benefit: "Basic Endurance & Fat Burning"
},
{
name: "Zone 1",
cls: "z1",
pct: "50-60%",
range: z1_min + " – " + (z1_max – 1),
benefit: "Warm Up & Active Recovery"
}
];
for (var i = 0; i < zones.length; i++) {
var row = "