# Body fat formulas for your AccuMeasure body fat calipers

by Rudd-O published 2017/01/18 15:41:00 GMT+0, last modified 2017-04-13T09:59:50+00:00
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:

1. 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.
2. 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.
3. 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 IfEnd 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 npimport replot as rpdef 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)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)    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("+")        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)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)
```