Notes › Life Essays › One calculation prints two body fat percentages: 6.1 points apart by default, 0.7 per 1 cm of waist

One calculation prints two body fat percentages: 6.1 points apart by default, 0.7 per 1 cm of waist

One click leaves two unrelated numbers on the screen

On the default male inputs (height 170 cm, weight 70 kg, 30 years, waist 80 cm, neck 38 cm), a single press of the button labelled "Calculate body fat percentage" returns two percentages at once: 13.7% in the large cell, 19.8% in the small line under it, 6.1 percentage points apart. Switch to the default female set (the same values plus hip 95 cm) and you get 25.6% and 30.6%, 5.0 percentage points apart.

The first guess is usually that the lower one is rougher and the upper one is finer. They are not two precision levels of one formula but two formulas whose input sets do not overlap at all. 13.7% comes from the US Navy girth method, which reads only height and girths and has no weight term. 19.8% comes from the expression converted from BMI, which reads only height, weight, age and sex and has no waist term. I pulled both expressions out of the body fat calculator template and ran them as written, so every number below is output reproducible from one click, not an estimate.

Push weight up 10 kg and only one number moves

Changing weight exposes this relationship best. Take the set male 175 cm, waist 90 cm, neck 38 cm, 32 years, and push weight from 73 kg to 83 kg: the large side stays at 20.7%, not one decimal shifts, while the side below walks from 19.8% to 23.7% and drags the neighbouring BMI calculator reading along from 23.8 to 27.1. One slider pushed to the end: one number does not budge, the other changes band entirely.

Age and sex feed only the lower number too. Toggling sex once moves the Deurenberg side by a constant 10.8 percentage points, because the sex term in that expression is nothing but male ? 1 : 0; moving age from 20 to 60 raises it 9.2 percentage points (the term reads 0.23 * age), while the Navy method stops at its old value, a difference of 0.0.

What is 1 cm of waist actually worth

The girth side is more sensitive than most people assume. On the male baseline (height 175, neck 38, waist 90), moving the waist by 1 cm is worth 0.7 to 0.8 percentage points, and moving it 5 cm is worth 3.4 to 3.8. On the female baseline (height 163, waist 76, neck 33, hip 96), waist, neck and hip each moved by 1 cm are worth 0.5 percentage points, and 5 cm is worth 2.5. Neck and waist carry the same magnitude with opposite signs because only one difference, waist - neck, appears in the expression; the extra hip term on the female line shares the sign of the waist.

Navy girth methodInputs: height waist neckNo weight termLarge 13.7%BMI conversionInputs: height weight ageSex, no waist termSmall 19.8%Same click, 6.1 pt apart

Fig. 1: two numbers side by side, and not one input fed to them overlaps, so these are not two approximations of the same quantity.

points0.7~0.83.4~3.80.52.5Male ±1 cmMale ±5 cmFemale ±1 cmFemale ±5 cm

Fig. 2: the shift on the Navy side when only girths move and everything else holds still; neck and waist move the same distance in opposite directions, and on the female line hip follows the waist.

The two numbers disagree all the time, but by different amounts

I ran all 12 parameter sets that somebody really types in, the two defaults on the first screen included: the smallest absolute gap between the two numbers is 0.1 percentage points, the largest is 6.1, the mean is 2.44, and 2/12 sets fall into different bands when each number is looked up against the page's own cutoffs. Taking only 10 real inputs and keeping the sign, the gap ranges from -4.3 to +1.3 with a mean of 1.82. The direction is not fixed, and nothing guarantees that the large number sits below the small one.

InputLarge cell (Navy method)Small line (BMI conversion)
Male 170 / 70 kg / 30 years / waist 80 / neck 3813.7%19.8%
Female, same values + hip 9525.6%30.6%
Female 166 / 60 kg / 60 years / waist 78 / neck 32 / hip 9830.2%34.5%
Male 175 / waist 90 / neck 38 / 32 years / 83 kg20.7%23.7%

The only guard is fitted on the male side

The whole logic carries exactly one input check: the male branch requires the waist to be strictly greater than the neck, and equality does not pass either. Feeding waist 80 with neck 80, then waist 80 with neck 81, the page shows nothing but the line "waist must be greater than neck" and returns, leaving the previous result on screen untouched in every digit. Old numbers left in place are easy to read as freshly calculated. The female branch holds no test at all between its two expressions: the same waist 80 neck 80 with hip 95 still returns 3.1%, and waist 70 neck 80 hip 95 returns -3.8%.

Both sets of inputs above sit inside the slider ranges. A more extreme set is still legal: female 163 cm / 58 kg with waist 50, neck 80 and hip 60 returns -59.5%, fat mass on the same line reads -34.5 kg, lean body mass 92.5 kg is larger than the weight itself, and the band cell prints "Essential fat". Male 220 cm with waist 50 and neck 49 returns -95%. What the guard inspects is the ordering between girths, not whether the result looks sane.

Only one other class is reachable by injecting values into the code: the log argument of the female expression, waist + hip - neck, ends at NaN or -Infinity as soon as it is non-positive, and the UI closes that road. All 6 inputs are range fields, step= appears 0 times in the template so only integers are possible, and an out-of-range value written in gets clamped back by the browser (measured 30→50, 250→200, empty string→125, abc→125, 75.5→76). Smallest waist 50 plus smallest hip 60 minus largest neck 80 leaves 30 as the smallest possible difference; enumerating all 1,192,296 integer girth sets, 0 of them are non-positive.

Right on the cutoff, two sentences contradict each other

Every band is a strict less-than: the four male cutoffs are 6, 14, 18, 25 and the female ones are 14, 21, 25, 32. Measured, 24.9 prints "Fitness" and 25.0 prints "Obese"; a male 6.0 has already entered "Athlete", while 5.9 stays one band lower. The trouble is that the advice line beneath uses a different comparison, switching wording only when body fat is greater than 25, so the single value 25.0 prints both "body fat is high" and "keep your current exercise and eating habits and monitor body fat changes regularly", two opposite sentences, and the female 32.0 behaves the same way. The labels quoted above are strings the page prints; they are not properties arrived at by measurement or by comparison against anything.

They are only the direct output of formulas and constants

It reads more cleanly if you treat this page as two calculators that never talk to each other: the large number answers only to height and girths, the small one only to height, weight, age and sex, and the band line simply takes one of the two and compares it with four hard-coded constants. Printing constants as conclusions is not unique to this page; the article on basal metabolic rate runs into the same reading problem. The screen never carries the half sentence "this is a judgement, not a measurement". As for which number ends up higher, it flips sign with the inputs, so it is not a conclusion either.

Q: Which of the two numbers should I read?

The page states no priority, and I will not write one for it. They are not two approximations of one quantity but two readings that each answer to half of the inputs. Across the 12 sets the absolute gap reaches 6.1 percentage points, so treating them as mutual checks misreads the layout.

Q: Why did nothing move when I changed my weight?

Because the expression behind the large number has no weight term in it. Pushing 73 kg to 83 kg leaves it at 20.7%, and the same change moves the small number from 19.8% to 23.7%. To find out whether an input takes part, watch whether it moves.

Q: My tape measure is off, so how much does that matter?

On the male baseline, 1 cm at the waist is 0.7 to 0.8 percentage points and 5 cm is 3.4 to 3.8; on the female baseline, 1 cm is 0.5 and 5 cm is 2.5. The tolerance at a cutoff is zero: 24.9 and 25.0 belong to different bands, and the pressure behind a single reading is enough to decide which advice sentence the screen shows.

📎 Related articles

A photo rotated 90° lies flat again on another device: how the EXIF flag and a real rotation split the work 2026-10-22 Same Day Every Month Versus Every 28 Days, 29 Days Apart Within a Year 2026-10-22 Shuffling with a random sort comparator is already unfair 2026-10-21 Two gallons, two horsepower ratings, two byte prefixes: ask which one first 2026-10-21 Born on 29 February: which day you turn 18 in a common year 2026-10-21