---
title: "G94 vs G95: Feed per Minute vs Feed per Rev"
description: "G94 reads F as units per minute, G95 as units per spindle revolution. What each mode does, where it is the default, and the two crashes mixing them causes."
url: https://gcodepractice.com/journal/g94-vs-g95-feed-per-minute-vs-feed-per-rev/
canonical: https://gcodepractice.com/journal/g94-vs-g95-feed-per-minute-vs-feed-per-rev/
author: "Lawrence Arya"
authorUrl: https://www.linkedin.com/in/vibecoding/
published: 2026-08-01
updated: 2026-08-01
category: "Code reference"
tags: ["g-code", "g94", "g95", "feed-rate", "lathe", "beginner"]
lang: en
---

# G94 vs G95: Feed per Minute vs Feed per Rev

> **TL;DR** G94 is feed per minute: F states travel per minute of clock time, the mill default. G95 is feed per revolution: F states travel per single spindle turn, the lathe habit, and it needs a spindle encoder to work. Convert with one multiplication, feed per minute = feed per rev x RPM. Mixing the modes up makes the tool crawl and rub in one direction, or drives it at maximum feed into the part in the other, so state the mode in every program's safety block.

G94 and G95 answer one question: what does your F word mean? Under G94, feed rate is units per minute, so F10 means the tool moves 10 inches or millimeters every minute regardless of what the spindle does. Under G95, feed rate is units per revolution, so F0.01 means the tool advances 0.01 units every time the spindle turns once. Mills default to G94, lathes usually run G95, and mixing them up produces feeds that are wrong by a factor of hundreds: an F expecting per-rev mode but running in per-minute mode crawls, and an F expecting per-minute mode but running in per-rev mode can slam the tool into the part at several hundred times the intended feed. This is why the pair belongs in the small set of codes worth knowing cold before you ever press cycle start.

## What does G94 actually do?

G94 sets feed per minute mode. Every F word after it states a velocity: units of travel per minute of clock time. The [LinuxCNC G-code reference](https://linuxcnc.org/docs/html/gcode/g-code.html) defines it exactly that way: with G94 active, F is interpreted as units per minute, inches or millimeters depending on whether [G20 or G21](/journal/g20-vs-g21-inch-vs-metric/) is active.

The important property of feed per minute is that it ignores the spindle. F20.0 in G94 produces the same table motion whether the spindle turns at 500 RPM, at 5,000 RPM, or is stopped entirely. That independence is what milling wants most of the time: a programmed toolpath with a feed the programmer already calculated from chip load, flute count, and RPM, as covered in [how to calculate feed rate for G01](/journal/how-to-calculate-feed-rate-for-g01/).

G94 is modal, like most of its neighbors. Set it once and it governs every feed move until something cancels it. On most mills you will never see it written, because it is the power-on default; it appears explicitly when a program wants to guarantee the mode after code that might have changed it.

## What does G95 actually do?

G95 sets feed per revolution mode. F now states a distance per spindle revolution: F0.012 means the tool advances 0.012 units for each full turn of the spindle. The control multiplies your F by the live spindle speed to get the actual velocity, so at 2,000 RPM an F0.01 produces 20 units of travel per minute, and if the spindle slows to 1,000 RPM the feed automatically halves.

That coupling is exactly what turning needs. On a lathe, surface finish and chip formation are governed by how far the tool advances per revolution of the workpiece, not per minute of clock time. Feed per rev also cooperates naturally with constant surface speed mode, where the control changes RPM continuously as the diameter changes; the feed follows the spindle without any recalculation, which is the same reason threading and [G97 spindle speed calculation](/journal/spindle-speed-calculation-for-g97-lathe/) lean on spindle-synchronized thinking.

One consequence surprises people: in G95, if the spindle is not turning, a feed move does not go anywhere meaningful. The commanded motion is defined in terms of revolutions, so per-rev feed with a stopped spindle is a fault or a crawl depending on the control. When a lathe program seems frozen on a feed move, spindle state is one of the first things worth checking.

## Where each mode is the default

| Machine / control family | Power-on feed mode | Typical F values you will see |
| --- | --- | --- |
| Fanuc mill (and most VMCs) | G94, feed per minute | F5.0 to F200.0 (in/min) or F100 to F5000 (mm/min) |
| Fanuc lathe | G98/G99 pair often used instead; per-rev common | F0.002 to F0.020 in/rev, F0.05 to F0.5 mm/rev |
| Haas mill | G94 | Same ranges as Fanuc mill |
| LinuxCNC | G94 | Either unit family, per config |
| GRBL routers | G94 only in practice | mm/min values in the hundreds to thousands |

Two footnotes to that table matter. First, on many Fanuc lathes the per-minute and per-rev pair is historically G98 and G99 rather than G94 and G95, while on mills G98 and G99 mean canned-cycle return planes instead. Same letters, different meaning by machine type, which is a classic Fanuc trap; the [Fanuc G-code list](https://www.helmancnc.com/fanuc-g-code-list/) shows both usages side by side. Always confirm which convention your control uses before trusting an example program from the internet. Second, hobby controls barely support per-rev mode at all, because most of them have no spindle encoder to count revolutions; without a real spindle feedback signal, G95 cannot work.

## The failure modes: what mixing them up looks like

The two accidents are mirror images. Accident one: a lathe-style F value runs in per-minute mode. F0.008 was meant as inches per revolution; interpreted as inches per minute it becomes a feed so slow the tool rubs instead of cutting, work hardens the material, cooks the insert, and looks like a machine fault. Nothing is broken; the F word is just being read in the wrong dimension.

Accident two is the dangerous one: a per-minute F value runs in per-rev mode. F10.0 meant 10 inches per minute; read as 10 inches per revolution at 1,000 RPM it commands 10,000 inches of travel per minute, which the machine cannot do, so it accelerates to its maximum feed and drives the tool at the part far faster than intended. Whether that ends as an alarm, a broken tool, or a scrapped part depends on luck and clearances. The general shape of the accident is the same one described in [why did my endmill break on G01](/journal/why-did-my-endmill-break-on-g01/): a legal-looking program with a number in the wrong dimension.

The prevention habit costs one line. Safety blocks at the top of a program state the assumed modes explicitly: G20 or G21, G90 or G91, G94 or G95, plane selection, cancel codes. With the mode pinned in writing, a program is immune to whatever state the previous job left the control in. Restarting mid-program deserves the same care, because jumping into the middle of code skips the safety block; the checklist in [how to safely restart a CNC program from the middle](/journal/how-to-safely-restart-a-cnc-program-from-the-middle/) exists for exactly this class of mistake.

## How to convert between the two modes

The arithmetic is one multiplication, and it is worth being able to do in your head at the machine. Feed per minute equals feed per revolution times RPM. Feed per revolution equals feed per minute divided by RPM. The same relationship underlies every feeds-and-speeds calculation, as the [speeds and feeds overview](https://en.wikipedia.org/wiki/Speeds_and_feeds) lays out: chip load per tooth times number of teeth gives feed per revolution, and multiplying by RPM gives feed per minute.

A worked example each way. A lathe insert wants 0.010 in/rev at 800 RPM: as a per-minute value that is 0.010 x 800 = 8.0 in/min. A mill program says F24.0 (in/min) at 3,000 RPM with a 2-flute end mill: per revolution that is 24 / 3000 = 0.008 in/rev, and per tooth it is 0.004 in, which is a sane chip load for a mid-size end mill in aluminum. If a conversion ever produces a chip load that looks absurd, thousandths where hundredths were expected or the reverse, the mode assumption somewhere upstream is wrong, and finding it before cycle start is the whole game.

## A worked lathe example, line by line

Here is the pair doing real work in a short facing and turning fragment, per-rev style, with the assumptions stated up front:

```
O1234
G21 G95 G90 (metric, feed per rev, absolute)
G97 S800 M03 (fixed 800 RPM, spindle on)
T0101
G00 X52.0 Z2.0
G01 Z-30.0 F0.25 (0.25 mm per revolution)
G00 X60.0 Z2.0
M05
M30
```

At 800 RPM, that F0.25 produces 0.25 x 800 = 200 mm/min of actual carriage travel. Change the S word to 400 and the same program feeds at 100 mm/min with an identical chip per revolution, which is why the finish stays constant when speeds change: the F word is expressing the thing that actually controls finish. Now rewrite the same motion in per-minute style, G94 with F200.0, and the cut is identical at 800 RPM but degrades the moment anyone changes the spindle speed, because the feed no longer follows. That difference, invisible in a single test cut, is the practical reason turning work stays in per-rev mode.

Reading unfamiliar programs, the F value itself is the strongest clue about the intended mode. Values below roughly 1.0 are almost always per-rev; values in the tens to thousands are per-minute. It is a heuristic, not a guarantee, but when the F magnitude and the active mode disagree with that pattern, stop and check before running.

## Why this pair is worth drilling

G94 versus G95 is a recall problem more than an understanding problem. The concept takes five minutes; the risk comes eight weeks later, at the machine, when a program from a colleague or a post processor contains an F word and your certainty about which mode is active has faded. The codes that cause crashes are rarely the exotic ones; they are the everyday modal states someone assumed instead of checked.

That is the case for practicing them the way you would vocabulary. A few minutes of active recall, being asked what F0.012 means under G95 at 1,200 RPM and having to produce the answer, builds the reflex that re-reading a reference chart never does. G-Code Sprint drills exactly this kind of question as short timed rounds and brings back the pairs you miss, which makes it a good fit for the mode codes, the [G90 versus G91 pair](/journal/g90-vs-g91-crash-prevention/), and the rest of the small set of codes that hurt when guessed.

## Bottom line: F means nothing until you know the mode

An F word has no meaning by itself. G94 makes it a velocity in units per minute, the mill default; G95 makes it a distance per spindle revolution, the lathe habit, and on many Fanuc lathes the same pair is spelled G98/G99. State the mode in a safety block, know the one-line conversion in both directions, sanity-check any F value that looks off by orders of magnitude, and remember that per-rev feed requires a turning spindle with an encoder. Everything else about the pair is detail; those five habits are the protection.

## Frequently asked questions

### What is the difference between G94 and G95?

G94 is feed per minute: F states units of travel per minute of clock time, independent of spindle speed. G95 is feed per revolution: F states units of travel per single spindle revolution, so actual velocity scales with RPM. Mills default to G94, lathes usually work per revolution, and on many Fanuc lathes the pair is spelled G98/G99 instead. The mode decides what every F word in the program means.

### What happens if I use a G95 feed value in G94 mode?

The tool crawls. A per-rev value like F0.008 read as per-minute becomes an extremely slow feed: the tool rubs rather than cuts, heats up, work hardens the material, and wears out fast. The reverse mistake is worse: a per-minute value like F10.0 read as per-rev commands enormous motion per revolution, and the machine accelerates to maximum feed toward the part. Both are prevented by stating G94 or G95 in the program's safety block.

### How do I convert feed per rev to feed per minute?

Multiply by RPM. Feed per minute = feed per revolution x spindle RPM, and feed per revolution = feed per minute / RPM. Example: 0.010 in/rev at 800 RPM is 8.0 in/min. The same relationship connects chip load: feed per rev = chip load per tooth x number of flutes. If a conversion gives a chip load that looks absurd, the mode assumption upstream is wrong.

### What is the best way to memorize feed mode codes like G94 and G95?

Active recall beats re-reading a chart. Have yourself asked what F0.01 means under each mode and produce the answer from memory, repeatedly, spaced over days. A free app like G-Code Sprint runs exactly that drill as quick timed questions and repeats the codes you miss, so the mode pairs, G94/G95, G90/G91, G20/G21, become reflexes before you are standing at a control with a part in the chuck.

### Does G95 work without a spindle encoder?

No. Feed per revolution requires the control to know the spindle's actual rotation, which needs an encoder or equivalent feedback. That is why hobby controllers such as GRBL machines effectively run per-minute feed only. On industrial machines with encoders, per-rev mode also means a feed move with a stopped spindle goes nowhere or faults, so spindle state is worth checking when a lathe program stalls on a feed move.

## Sources

- [LinuxCNC G-code reference](https://linuxcnc.org/docs/html/gcode/g-code.html)
- [HelmanCNC Fanuc G-code list](https://www.helmancnc.com/fanuc-g-code-list/)
- [Wikipedia: Speeds and feeds](https://en.wikipedia.org/wiki/Speeds_and_feeds)

---

Source: https://gcodepractice.com/journal/g94-vs-g95-feed-per-minute-vs-feed-per-rev/
Author: Lawrence Arya — https://www.linkedin.com/in/vibecoding/
