---
title: "G-Code to Calculate Chip Load: Forward, Reverse, and Macro"
description: "Chip load connects tool data to the F word: compute feed forward from chip load, audit any program in reverse, or let macro variables do it in the code."
url: https://gcodepractice.com/journal/g-code-to-calculate-chip-load/
canonical: https://gcodepractice.com/journal/g-code-to-calculate-chip-load/
author: "Lawrence Arya"
authorUrl: https://www.linkedin.com/in/vibecoding/
published: 2026-06-07
updated: 2026-06-07
category: "Guides"
tags: ["chip load", "feeds and speeds", "macro", "calculation"]
lang: en
---

# G-Code to Calculate Chip Load: Forward, Reverse, and Macro

> **TL;DR** Chip load is the thickness each cutting edge removes per revolution, and it connects tool data to the F word in both directions: forward, feed equals RPM times flutes times chip load, which is how you compute the F word for a program; and reverse, chip load equals feed divided by RPM times flutes, which is how you audit any program you did not write, including CAM output and AI drafts. On controls with macro variables the forward calculation can live in the code itself, so the program documents its own cutting assumptions.

Chip load is the thickness each cutting edge removes per revolution, the number that decides whether a [milling cutter](https://en.wikipedia.org/wiki/Milling_cutter) cuts, rubs, or snaps, and it connects to G-code through exactly one word: F. That connection runs in both directions, and the reverse direction is the underrated one, because it turns chip load from a planning number into an audit tool for any program you did not write.

## Why the per-tooth number rules the cut

Too little chip load and the edge stops cutting and starts rubbing: heat goes into the tool instead of the chip, the edge work-hardens the material under it, and the cutter dies young while sounding fine. Too much and the edge takes a bite the tool's core cannot carry, which ends in deflection, chatter, or the clean snap that teaches the lesson permanently. The published range between those failures is narrow, a few thousandths of an inch for most end mills, and the F word in a program is the only place that range gets enforced. That is the entire case for being able to move between chip load and F in both directions.

## Forward: from tool data to the F word

The forward chain starts at the tool maker's catalog, which publishes chip load per tooth for each cutter diameter and material family, the data layer explained across [speeds and feeds](https://en.wikipedia.org/wiki/Speeds_and_feeds) references. From there:

| Step | Formula | Worked example |
| --- | --- | --- |
| RPM first | (SFM x 12) / (pi x D) | 500 SFM, 0.5 in 4-flute: about 3,820 RPM |
| Feed per minute | RPM x flutes x chip load | 3,820 x 4 x 0.002 in: F30.6 with G94 |
| Feed per revolution | flutes x chip load | 4 x 0.002: F0.008 with G95 |
| Reverse audit | F / (RPM x flutes) | F30 at S3800, 4 flutes: 0.00197 in/tooth |

The G94/G95 row is the part that is genuinely G-code rather than arithmetic: the same physical chip load is expressed as F30.6 in per-minute mode and F0.008 in per-revolution mode, and feeding one mode's number to the other is a hundredfold error that parses perfectly. Which mode is active is modal state, set once and inherited silently, the same [bookkeeping that decides most of a program's meaning](/journal/how-to-read-g-code-to-find-errors/).

## Reverse: auditing a program's chip load

Any program that contains S and F words is making a chip load claim, and dividing exposes it: chip load = F / (RPM x flutes). The arithmetic takes ten seconds per tool and answers the question that matters about CAM output, inherited programs, and AI drafts alike: is this feed asking the cutter for something reasonable? A computed 0.002 on a half-inch end mill in aluminum sits comfortably in published ranges; a computed 0.011 from the same division is a snapped tool that has not happened yet. The broader why behind these numbers, and why no machine-brand chart can own them, is the [formulas-beat-the-file argument](/journal/haas-speeds-and-feeds-chart-pdf/); the per-tooth number here is the formula's beating heart.

The reverse audit catches a failure class nothing else does cheaply: programs that are syntactically perfect, geometrically correct, and physically wrong, the physics species of error that simulators wave through.

## Macro: the calculation inside the code

On controls with macro programming, the forward chain can live in the program itself:

```
#101 = 3800.    (spindle RPM)
#102 = 4.       (flutes)
#103 = 0.002    (chip load per tooth)
#104 = [#101 * #102 * #103]   (computed feed)
S#101 M03
G01 X2.500 F#104
```

The arithmetic is trivial; the value is documentation. A program written this way carries its own cutting assumptions in readable form, retunes every dependent feed when one variable changes, and hands the next machinist the why behind the numbers instead of a bare F30.6. Variable syntax and the neighborhoods variables live in are covered in [variable programming with #100s](/journal/cnc-variable-programming-100/), and dialects differ enough that the worked example above is Fanuc-macro-shaped rather than universal, with the [usual arithmetic walkthroughs](https://www.helmancnc.com/feed-rate-and-spindle-speed-calculation/) covering the formula side.

## The judgment layer

The published chip load is a starting point, not a verdict: long stickout, deep slots, thin walls, and light machines all argue for the low end or below it, and the cut's sound and finish report which end of the range the setup actually carries. What the formulas contribute is a defensible starting number and a fast audit; what experience contributes is the discount rate. Both lean on the same small vocabulary, S, F, G94, G95, and the surrounding core, being automatic, which is what the free 60-second drills on the [G-code practice page](/g-code-practice/) are for: the words at recall speed, so the thinking happens about the cut.

## Sources

- [Wikipedia: Speeds and feeds](https://en.wikipedia.org/wiki/Speeds_and_feeds)
- [Helman CNC: Feed rate and spindle speed calculation](https://www.helmancnc.com/feed-rate-and-spindle-speed-calculation/)
- [Wikipedia: Milling cutter](https://en.wikipedia.org/wiki/Milling_cutter)

## Frequently asked questions

### How do you calculate chip load from a G-code program?

Reverse the feed formula: chip load equals the F word divided by RPM times the number of flutes. F30 at S3800 with a 4-flute cutter commands about 0.002 inches per tooth, which you compare against the tool maker's recommended range.

### How do you calculate the F word from chip load?

Forward: feed equals RPM times flutes times chip load. At 3,800 RPM, 4 flutes, and 0.002 inches per tooth, that is F30.4 in per-minute mode, or F0.008 in G95 per-revolution mode.

### Can G-code itself calculate chip load with macro variables?

On controls with macro programming, yes: assign RPM, flutes, and chip load to variables and compute the feed in an expression. The program then carries its own cutting assumptions, and changing one variable retunes every dependent feed.

### What chip load should I use for my cutter?

The tool manufacturer's published range for your cutter diameter and material, reduced for long stickout, deep slotting, or light machines. The catalog number is the starting point; the cut's sound and finish refine it.

---

Source: https://gcodepractice.com/journal/g-code-to-calculate-chip-load/
Author: Lawrence Arya — https://www.linkedin.com/in/vibecoding/
