Case 944
The aperture number doubled and the light quartered
the_aperture_number_doubled_and_the_light_quartered.eml - A photographer closes the lens from f/2 to f/4 for a brighter scene, doubles the shutter time from 1/500 to 1/250 to pay for it, and reasons that a doubled f-number is half the light so a doubled time restores the exposure. How much light an f-number actually admits is computed below.
ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-21
EML
eml# Self-authored for the EML case corpus (no external origin). A photographer
# closes the lens from f/2 to f/4 for a brighter scene, doubles the shutter time
# from 1/500 to 1/250 to pay for it, and reasons that a doubled f-number is half
# the light so a doubled time restores the exposure. How much light an f-number
# actually admits is computed below.
#
# The reasoning is careful. The f-number really did double; the shutter time
# really did double; the two are the two controls of exposure and were moved in
# opposite directions; and the intent was exactly 'the same exposure, a smaller
# aperture'.
#
# The f-number is a length ratio and the light comes through an area, so
# doubling the number quarters the light - two stops, not one - and a doubled
# shutter pays back one of them, leaving the frame a stop dark; the standard
# f-stop scale steps by the square root of two for exactly this reason.
2 => f_number_before
4 => f_number_after
500 => shutter_denominator_before
250 => shutter_denominator_chosen
f_number_before^2 => aperture_area_divisor_before
f_number_after^2 => aperture_area_divisor_after
int(aperture_area_divisor_after / aperture_area_divisor_before) => light_fell_by_a_factor_of
int(shutter_denominator_before / shutter_denominator_chosen) => shutter_time_grew_by_a_factor_of
int(light_fell_by_a_factor_of / shutter_time_grew_by_a_factor_of) => exposure_still_short_by_a_factor_of
int(shutter_denominator_before / light_fell_by_a_factor_of) => shutter_denominator_that_would_have_restored_it
14 => f_stop_scale_a_times_ten
20 => f_stop_scale_b_times_ten
28 => f_stop_scale_c_times_ten
40 => f_stop_scale_d_times_ten
56 => f_stop_scale_e_times_ten
f_stop_scale_a_times_ten^2 => scale_a_squared
f_stop_scale_b_times_ten^2 => scale_b_squared
f_stop_scale_c_times_ten^2 => scale_c_squared
f_stop_scale_d_times_ten^2 => scale_d_squared
f_stop_scale_e_times_ten^2 => scale_e_squared
int(scale_b_squared * 100 / scale_a_squared) => step_ab_light_ratio_per_hundred
int(scale_c_squared * 100 / scale_b_squared) => step_bc_light_ratio_per_hundred
int(scale_d_squared * 100 / scale_c_squared) => step_cd_light_ratio_per_hundred
int(scale_e_squared * 100 / scale_d_squared) => step_de_light_ratio_per_hundred
"aperture before : f/" + str(f_number_before) + ", area divisor " + str(aperture_area_divisor_before) ^0
"aperture after : f/" + str(f_number_after) + ", area divisor " + str(aperture_area_divisor_after) ^0
"light fell by a factor of : " + str(light_fell_by_a_factor_of) + ", two stops" ^0
"shutter before : 1/" + str(shutter_denominator_before) ^0
"shutter chosen : 1/" + str(shutter_denominator_chosen) + ", time up by a factor of " + str(shutter_time_grew_by_a_factor_of) + ", one stop" ^0
"exposure still short by : a factor of " + str(exposure_still_short_by_a_factor_of) + ", one stop dark" ^0
"shutter that would restore it : 1/" + str(shutter_denominator_that_would_have_restored_it) ^0
"" ^0
"the f-stop scale, times ten : " + str(f_stop_scale_a_times_ten) + ", " + str(f_stop_scale_b_times_ten) + ", " + str(f_stop_scale_c_times_ten) + ", " + str(f_stop_scale_d_times_ten) + ", " + str(f_stop_scale_e_times_ten) ^0
"squared : " + str(scale_a_squared) + ", " + str(scale_b_squared) + ", " + str(scale_c_squared) + ", " + str(scale_d_squared) + ", " + str(scale_e_squared) ^0
"light ratio per step, per 100 : " + str(step_ab_light_ratio_per_hundred) + ", " + str(step_bc_light_ratio_per_hundred) + ", " + str(step_cd_light_ratio_per_hundred) + ", " + str(step_de_light_ratio_per_hundred) + " - each step halves the light" ^0
"" ^0
# ---- what the photographer verified ----
"the doubled-number reasoning" ^0
" f-number : doubled, " + str(f_number_before) + " to " + str(f_number_after) ^0
" shutter : doubled, 1/" + str(shutter_denominator_before) + " to 1/" + str(shutter_denominator_chosen) ^0
" direction : one closed, one opened, as exposure requires" ^0
" intent : the same exposure, a smaller aperture" ^0
" facts wrong : 0" ^0
" verdict : DOUBLE THE NUMBER, DOUBLE THE TIME, SAME EXPOSURE" ^0
"" ^0
" trading aperture against shutter time is the part done" ^0
" right here, and it is why the shutter change did recover" ^0
" exactly one of the stops that were lost" ^0
"" ^0
# ---- how much light an f-number admits ----
"a length ratio over an area" ^0
" what the f-number is : focal length over the opening's width" ^0
" what the light comes through : the opening's area, which goes" ^0
" as the width squared" ^0
" double the number : half the width, a quarter of the area," ^0
" a quarter of the light, " + str(light_fell_by_a_factor_of) + " times less" ^0
" what one stop is : half the light, and on the f-number scale" ^0
" that is a step of root two, " + str(f_stop_scale_a_times_ten) + " to " + str(f_stop_scale_b_times_ten) + " to " + str(f_stop_scale_c_times_ten) + " and on" ^0
" so f/" + str(f_number_before) + " to f/" + str(f_number_after) + " : two steps of that scale, two stops," ^0
" and one doubling of the shutter pays for one" ^0
"" ^0
# ---- what the photographer got ----
"the frame" ^0
" believed : the same exposure at a smaller aperture" ^0
" actual : a stop dark, a factor of " + str(exposure_still_short_by_a_factor_of) + " short" ^0
" is the f-number wrong : no; it doubled exactly" ^0
" is a doubled f-number half the light : no; it is a quarter," ^0
" because the number measures a width and the light fills an" ^0
" area" ^0
"" ^0
# ---- null control ----
# The same aperture change paid for by counting stops instead of by matching
# the doubling of the number.
2 => nc_light_lost_read_as_a_doubling
4 => nc_light_lost_read_as_an_area
2 => nc_factor_the_area_reading_reveals
"null control - count stops, not doublings of the number" ^0
" light lost, read as a doubling : " + str(nc_light_lost_read_as_a_doubling) + " times" ^0
" light lost, read as an area : " + str(nc_light_lost_read_as_an_area) + " times" ^0
" factor the area reading reveals : " + str(nc_factor_the_area_reading_reveals) ^0
" no lens and no scene changed; the number was read as the" ^0
" width it is and squared into the area the light uses" ^0
"" ^0
# ---- the rule ----
"what an exactly doubled f-number guarantees" ^0
" the opening is half as wide : exactly" ^0
" the light is halved : not addressed; the light crosses an" ^0
" area, half the width is a quarter of the area, " + str(light_fell_by_a_factor_of) + " times" ^0
" less light, and a doubled shutter recovers only " + str(shutter_time_grew_by_a_factor_of) + " of the " + str(light_fell_by_a_factor_of) ^0
"" ^0
"the number on the lens is a width and the light is an area; every doubling" ^0
"you read on the ring is a quartering in the frame, which is why the ring is" ^0
"marked in roots of two and not in twos" ^0
"" ^0
"The f-number doubled and the shutter doubled - both exact. But f/" + str(f_number_before) + " to f/" + str(f_number_after) + " is" ^0
"a quartering of the area, " + str(light_fell_by_a_factor_of) + " times less light, and a shutter " + str(shutter_time_grew_by_a_factor_of) + " times longer pays" ^0
"back half of that, so the frame is a stop dark and 1/" + str(shutter_denominator_that_would_have_restored_it) + " was needed, until" ^0
"the ring is read in stops, each a root of two, rather than in doublings." ^0Python (deterministic transpilation)
pythonf_number_before = 2
f_number_after = 4
shutter_denominator_before = 500
shutter_denominator_chosen = 250
aperture_area_divisor_before = f_number_before**2
aperture_area_divisor_after = f_number_after**2
light_fell_by_a_factor_of = int(aperture_area_divisor_after / aperture_area_divisor_before)
shutter_time_grew_by_a_factor_of = int(shutter_denominator_before / shutter_denominator_chosen)
exposure_still_short_by_a_factor_of = int(light_fell_by_a_factor_of / shutter_time_grew_by_a_factor_of)
shutter_denominator_that_would_have_restored_it = int(shutter_denominator_before / light_fell_by_a_factor_of)
f_stop_scale_a_times_ten = 14
f_stop_scale_b_times_ten = 20
f_stop_scale_c_times_ten = 28
f_stop_scale_d_times_ten = 40
f_stop_scale_e_times_ten = 56
scale_a_squared = f_stop_scale_a_times_ten**2
scale_b_squared = f_stop_scale_b_times_ten**2
scale_c_squared = f_stop_scale_c_times_ten**2
scale_d_squared = f_stop_scale_d_times_ten**2
scale_e_squared = f_stop_scale_e_times_ten**2
step_ab_light_ratio_per_hundred = int(scale_b_squared * 100 / scale_a_squared)
step_bc_light_ratio_per_hundred = int(scale_c_squared * 100 / scale_b_squared)
step_cd_light_ratio_per_hundred = int(scale_d_squared * 100 / scale_c_squared)
step_de_light_ratio_per_hundred = int(scale_e_squared * 100 / scale_d_squared)
print("aperture before : f/" + str(f_number_before) + ", area divisor " + str(aperture_area_divisor_before))
print("aperture after : f/" + str(f_number_after) + ", area divisor " + str(aperture_area_divisor_after))
print("light fell by a factor of : " + str(light_fell_by_a_factor_of) + ", two stops")
print("shutter before : 1/" + str(shutter_denominator_before))
print("shutter chosen : 1/" + str(shutter_denominator_chosen) + ", time up by a factor of " + str(shutter_time_grew_by_a_factor_of) + ", one stop")
print("exposure still short by : a factor of " + str(exposure_still_short_by_a_factor_of) + ", one stop dark")
print("shutter that would restore it : 1/" + str(shutter_denominator_that_would_have_restored_it))
print("")
print("the f-stop scale, times ten : " + str(f_stop_scale_a_times_ten) + ", " + str(f_stop_scale_b_times_ten) + ", " + str(f_stop_scale_c_times_ten) + ", " + str(f_stop_scale_d_times_ten) + ", " + str(f_stop_scale_e_times_ten))
print("squared : " + str(scale_a_squared) + ", " + str(scale_b_squared) + ", " + str(scale_c_squared) + ", " + str(scale_d_squared) + ", " + str(scale_e_squared))
print("light ratio per step, per 100 : " + str(step_ab_light_ratio_per_hundred) + ", " + str(step_bc_light_ratio_per_hundred) + ", " + str(step_cd_light_ratio_per_hundred) + ", " + str(step_de_light_ratio_per_hundred) + " - each step halves the light")
print("")
print("the doubled-number reasoning")
print(" f-number : doubled, " + str(f_number_before) + " to " + str(f_number_after))
print(" shutter : doubled, 1/" + str(shutter_denominator_before) + " to 1/" + str(shutter_denominator_chosen))
print(" direction : one closed, one opened, as exposure requires")
print(" intent : the same exposure, a smaller aperture")
print(" facts wrong : 0")
print(" verdict : DOUBLE THE NUMBER, DOUBLE THE TIME, SAME EXPOSURE")
print("")
print(" trading aperture against shutter time is the part done")
print(" right here, and it is why the shutter change did recover")
print(" exactly one of the stops that were lost")
print("")
print("a length ratio over an area")
print(" what the f-number is : focal length over the opening's width")
print(" what the light comes through : the opening's area, which goes")
print(" as the width squared")
print(" double the number : half the width, a quarter of the area,")
print(" a quarter of the light, " + str(light_fell_by_a_factor_of) + " times less")
print(" what one stop is : half the light, and on the f-number scale")
print(" that is a step of root two, " + str(f_stop_scale_a_times_ten) + " to " + str(f_stop_scale_b_times_ten) + " to " + str(f_stop_scale_c_times_ten) + " and on")
print(" so f/" + str(f_number_before) + " to f/" + str(f_number_after) + " : two steps of that scale, two stops,")
print(" and one doubling of the shutter pays for one")
print("")
print("the frame")
print(" believed : the same exposure at a smaller aperture")
print(" actual : a stop dark, a factor of " + str(exposure_still_short_by_a_factor_of) + " short")
print(" is the f-number wrong : no; it doubled exactly")
print(" is a doubled f-number half the light : no; it is a quarter,")
print(" because the number measures a width and the light fills an")
print(" area")
print("")
nc_light_lost_read_as_a_doubling = 2
nc_light_lost_read_as_an_area = 4
nc_factor_the_area_reading_reveals = 2
print("null control - count stops, not doublings of the number")
print(" light lost, read as a doubling : " + str(nc_light_lost_read_as_a_doubling) + " times")
print(" light lost, read as an area : " + str(nc_light_lost_read_as_an_area) + " times")
print(" factor the area reading reveals : " + str(nc_factor_the_area_reading_reveals))
print(" no lens and no scene changed; the number was read as the")
print(" width it is and squared into the area the light uses")
print("")
print("what an exactly doubled f-number guarantees")
print(" the opening is half as wide : exactly")
print(" the light is halved : not addressed; the light crosses an")
print(" area, half the width is a quarter of the area, " + str(light_fell_by_a_factor_of) + " times")
print(" less light, and a doubled shutter recovers only " + str(shutter_time_grew_by_a_factor_of) + " of the " + str(light_fell_by_a_factor_of))
print("")
print("the number on the lens is a width and the light is an area; every doubling")
print("you read on the ring is a quartering in the frame, which is why the ring is")
print("marked in roots of two and not in twos")
print("")
print("The f-number doubled and the shutter doubled - both exact. But f/" + str(f_number_before) + " to f/" + str(f_number_after) + " is")
print("a quartering of the area, " + str(light_fell_by_a_factor_of) + " times less light, and a shutter " + str(shutter_time_grew_by_a_factor_of) + " times longer pays")
print("back half of that, so the frame is a stop dark and 1/" + str(shutter_denominator_that_would_have_restored_it) + " was needed, until")
print("the ring is read in stops, each a root of two, rather than in doublings.")stdout (executed)
textaperture before : f/2, area divisor 4
aperture after : f/4, area divisor 16
light fell by a factor of : 4, two stops
shutter before : 1/500
shutter chosen : 1/250, time up by a factor of 2, one stop
exposure still short by : a factor of 2, one stop dark
shutter that would restore it : 1/125
the f-stop scale, times ten : 14, 20, 28, 40, 56
squared : 196, 400, 784, 1600, 3136
light ratio per step, per 100 : 204, 196, 204, 196 - each step halves the light
the doubled-number reasoning
f-number : doubled, 2 to 4
shutter : doubled, 1/500 to 1/250
direction : one closed, one opened, as exposure requires
intent : the same exposure, a smaller aperture
facts wrong : 0
verdict : DOUBLE THE NUMBER, DOUBLE THE TIME, SAME EXPOSURE
trading aperture against shutter time is the part done
right here, and it is why the shutter change did recover
exactly one of the stops that were lost
a length ratio over an area
what the f-number is : focal length over the opening's width
what the light comes through : the opening's area, which goes
as the width squared
double the number : half the width, a quarter of the area,
a quarter of the light, 4 times less
what one stop is : half the light, and on the f-number scale
that is a step of root two, 14 to 20 to 28 and on
so f/2 to f/4 : two steps of that scale, two stops,
and one doubling of the shutter pays for one
the frame
believed : the same exposure at a smaller aperture
actual : a stop dark, a factor of 2 short
is the f-number wrong : no; it doubled exactly
is a doubled f-number half the light : no; it is a quarter,
because the number measures a width and the light fills an
area
null control - count stops, not doublings of the number
light lost, read as a doubling : 2 times
light lost, read as an area : 4 times
factor the area reading reveals : 2
no lens and no scene changed; the number was read as the
width it is and squared into the area the light uses
what an exactly doubled f-number guarantees
the opening is half as wide : exactly
the light is halved : not addressed; the light crosses an
area, half the width is a quarter of the area, 4 times
less light, and a doubled shutter recovers only 2 of the 4
the number on the lens is a width and the light is an area; every doubling
you read on the ring is a quartering in the frame, which is why the ring is
marked in roots of two and not in twos
The f-number doubled and the shutter doubled - both exact. But f/2 to f/4 is
a quartering of the area, 4 times less light, and a shutter 2 times longer pays
back half of that, so the frame is a stop dark and 1/125 was needed, until
the ring is read in stops, each a root of two, rather than in doublings.Trace event types
eml:run:starteml:assigneml:outputeml:run:done