Stops between two apertures calculator
The stops between two apertures calculator compares any two positive f-numbers and reports their signed and absolute exposure difference.
Run — free
It also shows how much light the second aperture passes relative to the first and the exposure multiplier needed to keep the photograph equally bright. Use it when changing lenses, translating a setup between different maximum apertures, or planning an equivalent shutter-speed or ISO adjustment. The calculation follows the optical area relationship behind f-stops, so it works for standard, third-stop, half-stop, and unusual aperture values.
Reading the signed stop difference
Enter the aperture you are starting from as the first f-number and the aperture you plan to use as the second. The calculator treats direction as meaningful. A positive stops difference means the second f-number is larger, the opening is narrower, and less light reaches the sensor. You must therefore add the stated amount of exposure through a slower shutter speed, a higher ISO, more flash power, or another controlled adjustment. A negative result means the second aperture is wider and admits more light, so you must remove the absolute number of stops elsewhere to preserve brightness. The absolute stops field ignores direction and is useful when you only need the size of the gap. If both apertures are equal, the result is zero and no compensation is required. Keep the first and second values in the intended order when comparing lenses, because reversing them keeps the magnitude but changes the sign and reverses the practical instruction.
Why f-numbers use a logarithmic calculation
An f-number describes the ratio between a lens's focal length and the diameter of its entrance pupil. Light-gathering area changes with the square of that diameter, which is why simply subtracting two f-numbers does not produce an exposure difference. This calculator first forms the ratio of the second aperture to the first, then takes twice its base-two logarithm. Each increase of one stop halves the light, while each decrease of one stop doubles it. For example, moving through the familiar full-stop sequence changes the f-number by approximately the square root of two, not by a fixed amount. The exposure multiplier tells you how much longer the exposure must become at the second aperture to match the first, assuming ISO and scene illumination stay constant. The light multiplier describes the reciprocal relationship: how much light the second setting passes compared with the first. Real lenses can differ slightly because marked f-numbers describe geometry rather than measured transmission, but this is the standard exposure calculation used for photographic planning.
Applying the result to shutter speed, ISO, or lighting
Once you know the stop difference, compensate with any exposure control that can supply the same signed change. If the second aperture is two stops narrower, make the shutter exposure four times longer, raise ISO by a factor of four, increase continuous illumination accordingly, or split the adjustment across controls. If the second aperture is wider, perform the inverse adjustment. Think carefully about creative side effects: changing shutter speed alters motion blur, changing ISO affects noise and highlight headroom, and changing flash power can affect recycle time or duration. The output does not choose a replacement shutter speed or ISO because it does not know which variable you want to preserve; instead, its exposure multiplier provides the exact factor for your chosen control. This makes the tool helpful when one lens cannot reach another lens's aperture, when recreating a reference exposure with different equipment, or when estimating the light penalty of stopping down for depth of field. API requests use the same deterministic calculation and cost $0.002 per request.
What you can do with it
Match exposure after changing lenses
Compare the working apertures of two lenses and apply the reported compensation without guessing from rounded stop markings.
Plan a depth-of-field change
Find how much shutter time, ISO, or lighting must change when stopping down for greater depth of field.
Recreate a reference setup
Translate an aperture from a lighting diagram or camera setup into an exposure adjustment for equipment with a different available f-number.
FAQ
What does a positive stops difference mean?
The second aperture is narrower and passes less light. Add the stated number of stops through shutter speed, ISO, or lighting to maintain exposure.
What does a negative stops difference mean?
The second aperture is wider and passes more light. Remove the absolute number of stops elsewhere to maintain the same exposure.
Why is the difference not found by subtracting the f-numbers?
Because light-gathering area changes with the square of aperture diameter. Exposure stops are logarithmic, so the formula is twice the base-two logarithm of the f-number ratio.
Does this account for T-stops?
No. It compares geometric f-numbers. Lens transmission losses can make the measured light difference slightly different; use calibrated T-stops when transmission precision is required.
How much does an API request cost?
Each API request costs $0.002. The browser calculator uses the same deterministic formula.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/hobby/photo-stops-between-apertures \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"first_aperture":2.8,"second_aperture":5.6}'const res = await fetch("https://api.kit.forhosting.com/hobby/photo-stops-between-apertures", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"first_aperture": 2.8,
"second_aperture": 5.6
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/hobby/photo-stops-between-apertures",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"first_aperture": 2.8,
"second_aperture": 5.6
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/hobby/photo-stops-between-apertures", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"first_aperture":2.8,"second_aperture":5.6}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"first_aperture":2.8,"second_aperture":5.6}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/hobby/photo-stops-between-apertures", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"first_aperture": 2.8,
"second_aperture": 5.6
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "hobby.photo_stops_between_apertures",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |