Body fat formulas for your AccuMeasure body fat calipers
This is a set of formulas that you can use to convert the measurements of your AccuMeasure calipers to body fat percentage. Follow the instructions, then plug the number on the appropriate formula. You'll get quite the accurate measurement of your body fat, with none of the hassle of looking up numbers on a table.
The x in the formulas represent what you measured with your AccuMeasure in millimeters, when you follow the instructions correctly, and they are derived from the table that ships with the device. Plug the measurement (fractional values are okay) into the formulas. The output of the formula is a percentage number (as in 0—100, not 0—1). The maximum error (discrepancy) between these formulas and the values in the AccuMeasure table is less than 1%.
Tips:
- Use these formulas on your favorite spreadsheet to track your body fat daily. That way you don't have to do math or look stuff up. The example spreadsheet formula is next to the mathematical one in the tables below.
- Always measure yourself right after you wake up. Never change the time you measure relative to when you wake up — you'll get erratic measurements.
- Always measure in exactly the same way you did the previous day. Pinch the same abdominal area, clip the same fold. Day-to-day repeatability of the measurements is more important than absolute accuracy.
Men's formulas
Age bracket | Mathematical x is mm, y is body fat % |
Excel / LibreOffice / spreadsheet A1 is cell containing mm, output is body fat % |
---|---|---|
18—20 | y = -0.016558 x² + 1.338304 x + -1.613505 | =-0.016558 * (A1 * A1) + 1.338304 * (A1) + -1.613505 |
21—25 | y = -0.017450 x² + 1.375824 x + -0.898402 | =-0.017450 * (A1 * A1) + 1.375824 * (A1) + -0.898402 |
26—30 | y = -0.017355 x² + 1.372444 x + 0.181479 | =-0.017355 * (A1 * A1) + 1.372444 * (A1) + 0.181479 |
31—35 | y = -0.017569 x² + 1.381746 x + 1.179773 | =-0.017569 * (A1 * A1) + 1.381746 * (A1) + 1.179773 |
36—40 | y = -0.017623 x² + 1.383619 x + 2.233607 | =-0.017623 * (A1 * A1) + 1.383619 * (A1) + 2.233607 |
41—45 | y = -0.017754 x² + 1.388621 x + 3.280957 | =-0.017754 * (A1 * A1) + 1.388621 * (A1) + 3.280957 |
46—50 | y = -0.017754 x² + 1.388621 x + 3.280957 | =-0.017687 * (A1 * A1) + 1.386841 * (A1) + 4.319327 |
51—55 | y = -0.017610 x² + 1.382021 x + 5.445419 | =-0.017610 * (A1 * A1) + 1.382021 * (A1) + 5.445419 |
56+ | y = -0.017394 x² + 1.374599 x + 6.552526 | =-0.017394 * (A1 * A1) + 1.374599 * (A1) + 6.552526 |
Women's formulas
Unfortunately, I haven't generated the formulas for women yet.
Homework: Check out the charts at the AccuMeasure web site, use the workbench code below to generate them, and send the changes to me!
LibreOffice macro formula for your spreadsheet
Function bodyfat(measuremm As String, age As String)
Dim measuremm_d as Double
Dim age_d as Double
measuremm_d = Val(measuremm)
age_d = Val(age)
If age_d >= 18 and age_d <= 20 Then
bodyfat = (-0.016558 * (measuremm_d * measuremm_d)) + (1.338304 * measuremm_d) + -1.613505
Elseif age_d >= 21 and age_d <= 25 Then
bodyfat = (-0.017450 * (measuremm_d * measuremm_d)) + (1.375824 * measuremm_d) + -0.898402
Elseif age_d >= 26 and age_d <= 30 Then
bodyfat = (-0.017355 * (measuremm_d * measuremm_d)) + (1.372444 * measuremm_d) + 0.181479
Elseif age_d >= 31 and age_d <= 35 Then
bodyfat = (-0.017569 * (measuremm_d * measuremm_d)) + (1.381746 * measuremm_d) + 1.179773
Elseif age_d >= 36 and age_d <= 40 Then
bodyfat = (-0.017623 * (measuremm_d * measuremm_d)) + (1.383619 * measuremm_d) + 2.233607
Elseif age_d >= 41 and age_d <= 45 Then
bodyfat = (-0.017754 * (measuremm_d * measuremm_d)) + (1.388621 * measuremm_d) + 3.280957
Elseif age_d >= 46 and age_d <= 50 Then
bodyfat = (-0.017687 * (measuremm_d * measuremm_d)) + (1.386841 * measuremm_d) + 4.319327
Elseif age_d >= 51 and age_d <= 55 Then
bodyfat = (-0.017610 * (measuremm_d * measuremm_d)) + (1.382021 * measuremm_d) + 5.445419
Elseif age_d >= 56 Then
bodyfat = (-0.017394 * (measuremm_d * measuremm_d)) + (1.374599 * measuremm_d) + 6.552526
End If
End Function
Reinteract workbench code
These numbers were reverse-engineered with the assistance of Reinteract, an excellent mathematical analysis workbench for Python and Linux. Run this code on your Reinteract workbench to get those values.
import numpy as np
import replot as rp
def arr(seqstr):
return np.array([ float(x) for x in seqstr.split() ])
xs = "2.5 4.5 6.5 8.5 10.5 12.5 14.5 16.5 18.5 20.5 22.5 24.5 26.5 28.5 30.5 32.5 35"
xs = arr(xs)
ys = {}
ys['1820'] = '2 3.9 6.2 8.5 10.5 12.5 14.3 16.0 17.5 18.9 20.2 21.3 22.3 23.1 23.8 24.3 24.9'
ys['2125'] = '2.5 4.9 7.3 9.5 11.6 13.6 15.4 17.0 18.6 20 21.2 22.3 23.3 24.2 24.9 25.4 25.8'
ys['2630'] = '3.5 6 8.4 10.6 12.7 14.6 16.4 18.1 19.6 21 22.3 23.4 24.4 25.2 25.9 26.5 26.9'
ys['3135'] = '4.5 7.1 9.4 11.7 13.7 15.7 17.5 19.2 20.7 22.1 23.4 24.5 25.5 26.3 27 27.5 28'
ys['3640'] = '5.6 8.1 10.5 12.7 14.8 16.8 18.6 20.2 21.8 23.2 24.4 25.6 26.5 27.4 28.1 28.6 29'
ys['4145'] = '6.7 9.2 11.5 13.8 15.9 17.8 19.6 21.3 22.8 24.7 25.5 26.6 27.6 28.4 29.1 29.7 30.1'
ys['4650'] = '7.7 10.2 12.6 14.8 16.9 18.9 20.7 22.4 23.9 25.3 26.6 27.7 28.7 29.5 30.1 30.7 31.2'
ys['5155'] = '8.8 11.3 13.7 15.9 18.0 20.0 21.8 23.4 25.0 26.4 27.6 28.7 29.7 30.6 31.2 31.8 32.2'
ys['56+ '] = '9.9 12.4 14.7 17 19.1 21 22.8 24.5 26 27.4 28.7 29.8 30.8 31.6 32.3 32.9 33.3'
itms = sorted(ys.items(), key=lambda x: x[1])
for k, v in itms:
v = arr(v)
coeffs = np.polyfit(xs, v, 2)
print k, " ",
print "y = %f x² + %f x + %f" % tuple([float(x) for x in coeffs]), " ",
print "=%f * (A1 * A1) + %f * (A1) + %f" % tuple([float(x) for x in coeffs])
def gen_function():
print "Function bodyfat(measuremm As String, age As String)"
print " Dim measuremm_d as Double"
print " Dim age_d as Double"
print " measuremm_d = Val(measuremm)"
print " age_d = Val(age)"
itms = sorted(ys.items(), key=lambda x: x[1])
for n, (k, v) in enumerate(itms):
v = arr(v)
coeffs = np.polyfit(xs, v, 2)
iff = "Elseif" if n > 0 else "If"
try:
print " %s age_d >= %s and age_d <= %s Then" % tuple([iff] + k.split(""))
except TypeError:
print " Elseif age_d >= %s Then" % k.split("+")[0]
print " bodyfat = (%f * (measuremm_d * measuremm_d)) + (%f * measuremm_d) + %f" % tuple([float(x) for x in coeffs])
print " End If"
print "End Function"
gen_function()
itms = sorted(ys.items(), key=lambda x: x[1])
for k, v in itms:
v = arr(v)
coeffs = np.polyfit(xs, v, 2)
v_proof = np.polyval(coeffs, xs)
rp.plot(xs, v, xs, v_proof)