ISO stops difference calculator
The ISO stops difference calculator compares two camera sensitivity settings and reports how many stops separate them.
Run — free
Enter a starting ISO and a target ISO to evaluate the base-two logarithm of their ratio. A positive answer means the target setting is more sensitive, a negative answer means it is less sensitive, and zero means the values match. The result works for standard full-stop numbers, intermediate settings, and custom measured values, making it useful for exposure planning, camera tests, lighting notes, and repeatable photography workflows.
What a stop difference between ISO values means
In photography, one full stop represents a factor of two in exposure-related quantity. Doubling ISO from 100 to 200 is therefore an increase of one stop, while moving from 200 to 800 is an increase of two stops because the sensitivity ratio is four. This calculator extends that familiar rule to any two positive ISO values, including third-stop settings and values that do not appear on a camera dial. It treats iso_from as the reference and iso_to as the destination. The signed result describes the move from the first value to the second: positive is an increase, negative is a decrease, and zero means no change. The accompanying ratio gives another way to read the comparison. A ratio of eight corresponds to three stops; a ratio of one quarter corresponds to negative two stops. ISO itself does not add light to a scene, and changing it is not physically identical to opening an aperture or lengthening a shutter time. The stop language is still valuable because it expresses the proportional sensitivity change on the same base-two scale used throughout exposure calculations.
How the logarithmic calculation works
The calculation is stops_difference = log2(iso_to / iso_from). First, the target ISO is divided by the starting ISO. The base-two logarithm then answers how many doublings, or fractional doublings, produce that ratio. If the target is ISO 800 and the start is ISO 100, the ratio is eight and log2(8) is three. Reversing the inputs produces a ratio of one eighth and a result of negative three. Values do not have to form an exact power of two: moving from ISO 100 to ISO 125 is about 0.321928 stops, which is close to a third-stop increment but preserves the mathematical value rather than forcing it to a camera setting. Both inputs must be finite and greater than zero because zero and negative sensitivity values cannot form a meaningful logarithmic ratio. Results are rounded to twelve decimal places for stable output while retaining more precision than ordinary exposure decisions require. The direction field summarizes the sign, but the numeric stop result should be used when compensating another exposure variable or comparing measurements.
Using the result in practical exposure work
Use the signed stop difference whenever you need to record or compensate for an ISO change. If the result is positive three stops, maintaining a comparable image brightness under a simple manual-exposure model would require removing three stops elsewhere, such as using a shutter time one eighth as long, closing the aperture by an equivalent amount, or combining adjustments. Real cameras complicate that comparison: ISO changes amplification and processing, available ISO markings may be rounded, dynamic range and noise can change, and automatic modes may alter more than one setting. For that reason, treat this calculator as an exact ratio converter rather than a promise that two photographs will look identical. It is especially helpful in automated test reports because the output includes the original values, their ratio, the signed difference, and an explicit direction. The algorithm is deterministic and sends no request to another service. Interactive browser use keeps the calculation local, while a successful API calculation costs $0.002 per item. For reproducible notes, preserve the input order and state whether the result is being used as a sensitivity comparison, an exposure compensation step, or a description of a camera test.
What you can do with it
Plan an exposure adjustment
Convert an ISO change into signed stops before balancing it with shutter speed, aperture, or neutral-density filtration.
Compare camera test settings
Quantify the exact sensitivity interval between two test frames, including nonstandard or intermediate ISO values.
Normalize photography records
Add a consistent ISO ratio and stop difference to shot logs, lighting diagrams, or automated image metadata reports.
FAQ
What formula is used?
The calculator uses stops_difference = log2(iso_to / iso_from), where iso_from is the reference and iso_to is the target.
Why can the result be negative?
A negative result means the target ISO is lower than the starting ISO. For example, ISO 800 to ISO 100 is a decrease of three stops.
Can I enter third-stop ISO settings?
Yes. Any finite positive values within the published range are accepted, and the result is not restricted to whole stops.
Does raising ISO create more light?
No. ISO changes the camera's sensitivity setting or signal processing; it does not change scene illumination or the amount of light passing through the lens.
How much does an API calculation cost?
A successful API calculation costs $0.002 per item. The same deterministic calculation is also available in the browser.
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/optics/iso-stops-difference \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"iso_from":100,"iso_to":800}'const res = await fetch("https://api.kit.forhosting.com/optics/iso-stops-difference", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"iso_from": 100,
"iso_to": 800
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/optics/iso-stops-difference",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"iso_from": 100,
"iso_to": 800
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/optics/iso-stops-difference", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"iso_from":100,"iso_to":800}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"iso_from":100,"iso_to":800}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/optics/iso-stops-difference", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"iso_from": 100,
"iso_to": 800
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "optics.iso_stops_difference",
"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. |