Case 969
The ten thousand milliamp hours were at another voltage
the_ten_thousand_milliamp_hours_were_at_another_voltage.eml - A power bank is labelled 10000 mAh, a phone battery is labelled 3000 mAh, the buyer divides one by the other and expects three full charges and a third, and gets two and a bit. What a milliamp-hour is, and what it is not, is computed below.
ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-22
EML
eml# Self-authored for the EML case corpus (no external origin). A power bank is
# labelled 10000 mAh, a phone battery is labelled 3000 mAh, the buyer divides
# one by the other and expects three full charges and a third, and gets two
# and a bit. What a milliamp-hour is, and what it is not, is computed below.
#
# The reasoning is careful. Both labels are accurate; both are in the same unit;
# the division is right; the power bank was full and the phone empty; and the
# intent was exactly 'how many charges is this'.
#
# A milliamp-hour is a quantity of charge, not of energy, and charge only
# compares across devices at the same voltage - the bank stores its charge at
# 3.7 volts and the phone at 3.85, and the conversion between them through five
# volts loses a seventh - so the honest unit is the watt-hour, and in watt-hours
# the bank holds two and seven tenths of the phone, not three and a third.
10000 => bank_label_mah
37 => bank_cell_volts_tenths
3000 => phone_label_mah
385 => phone_cell_volts_hundredths
85 => conversion_efficiency_percent
int(bank_label_mah * 10000 / phone_label_mah) => charges_the_labels_seem_to_promise_per_myriad
int(bank_label_mah * bank_cell_volts_tenths / 10) => bank_energy_mwh
int(phone_label_mah * phone_cell_volts_hundredths / 100) => phone_energy_mwh
int(bank_energy_mwh * 10000 / phone_energy_mwh) => charges_by_energy_before_losses_per_myriad
int(bank_energy_mwh * conversion_efficiency_percent / 100) => bank_energy_delivered_mwh
bank_energy_mwh - bank_energy_delivered_mwh => energy_lost_in_conversion_mwh
int(bank_energy_delivered_mwh * 10000 / phone_energy_mwh) => charges_actually_delivered_per_myriad
int(charges_actually_delivered_per_myriad / 10000) => full_charges_actually_delivered
charges_the_labels_seem_to_promise_per_myriad - charges_actually_delivered_per_myriad => charges_the_label_arithmetic_overstates_per_myriad
"power bank : " + str(bank_label_mah) + " mAh at " + str(bank_cell_volts_tenths) + " tenths of a volt, " + str(bank_energy_mwh) + " mWh" ^0
"phone battery : " + str(phone_label_mah) + " mAh at " + str(phone_cell_volts_hundredths) + " hundredths of a volt, " + str(phone_energy_mwh) + " mWh" ^0
"" ^0
"charges, dividing the labels : " + str(charges_the_labels_seem_to_promise_per_myriad) + " per ten thousand of a charge" ^0
"charges, dividing the energies : " + str(charges_by_energy_before_losses_per_myriad) + " per ten thousand, before losses" ^0
"conversion through 5 V : " + str(conversion_efficiency_percent) + " percent kept, " + str(energy_lost_in_conversion_mwh) + " mWh lost" ^0
"charges actually delivered : " + str(charges_actually_delivered_per_myriad) + " per ten thousand, " + str(full_charges_actually_delivered) + " full charges" ^0
"label arithmetic overstates by : " + str(charges_the_label_arithmetic_overstates_per_myriad) + " per ten thousand of a charge" ^0
"" ^0
# ---- what the buyer verified ----
"the same-unit reasoning" ^0
" bank label : " + str(bank_label_mah) + " mAh, accurate" ^0
" phone label : " + str(phone_label_mah) + " mAh, accurate" ^0
" units : the same, so the division is legitimate" ^0
" arithmetic : " + str(charges_the_labels_seem_to_promise_per_myriad) + " per ten thousand, three charges and a third" ^0
" intent : how many charges is this" ^0
" facts wrong : 0" ^0
" verdict : THREE FULL CHARGES AND A THIRD" ^0
"" ^0
" reading both labels accurately is the part done right" ^0
" here, and it is why both numbers in the division are the" ^0
" numbers the makers printed" ^0
"" ^0
# ---- what a milliamp-hour is not ----
"charge is not energy" ^0
" what mAh counts : how much charge passed, with no word about" ^0
" the voltage it passed at" ^0
" what the phone needs : energy, charge times voltage, " + str(phone_energy_mwh) + " mWh" ^0
" what the bank holds : " + str(bank_energy_mwh) + " mWh, its charge at its own " + str(bank_cell_volts_tenths) + " tenths of a volt" ^0
" what the cable carries : five volts, so the bank steps up and" ^0
" the phone steps down, and each step costs" ^0
" what arrives : " + str(bank_energy_delivered_mwh) + " mWh, " + str(charges_actually_delivered_per_myriad) + " per ten thousand of a charge" ^0
" what the labels compared : two charges at two voltages, as" ^0
" if the voltage were the same" ^0
"" ^0
# ---- what the buyer got ----
"the count" ^0
" believed : three charges and a third" ^0
" actual : " + str(full_charges_actually_delivered) + " full charges and " + str(charges_actually_delivered_per_myriad - full_charges_actually_delivered * 10000) + " per ten thousand of another" ^0
" is either label wrong : no; both are accurate in mAh" ^0
" is mAh the right unit to divide : no; it omits the voltage," ^0
" and the two devices do not share one" ^0
"" ^0
# ---- null control ----
# The same comparison made in watt-hours, with the conversion loss included,
# instead of in milliamp-hours.
33333 => nc_charges_comparing_milliamp_hours_per_myriad
27229 => nc_charges_comparing_watt_hours_after_losses_per_myriad
6104 => nc_charge_the_unit_change_removes_per_myriad
"null control - compare energy, not charge" ^0
" charges, comparing mAh : " + str(nc_charges_comparing_milliamp_hours_per_myriad) + " per ten thousand" ^0
" charges, comparing mWh after losses : " + str(nc_charges_comparing_watt_hours_after_losses_per_myriad) + " per ten thousand" ^0
" charge the unit change removes : " + str(nc_charge_the_unit_change_removes_per_myriad) + " per ten thousand" ^0
" no label and no battery changed; the quantity that carries" ^0
" the voltage was the one divided" ^0
"" ^0
# ---- the rule ----
"what two accurate mAh labels guarantee" ^0
" each device's charge at its own voltage : exactly" ^0
" the ratio of the labels is the number of charges : not addressed;" ^0
" charge compares only at one voltage, energy is what is" ^0
" transferred, and " + str(bank_energy_delivered_mwh) + " mWh delivered into " + str(phone_energy_mwh) + " mWh is " + str(charges_actually_delivered_per_myriad) + " per" ^0
" ten thousand of a charge, not " + str(charges_the_labels_seem_to_promise_per_myriad) ^0
"" ^0
"a unit that leaves out one of the factors is a number that compares only" ^0
"with itself; two labels in milliamp-hours agree on everything except the" ^0
"volts, and the volts are where the charges went" ^0
"" ^0
"Both labels are accurate and the division is right - in mAh. But mAh is" ^0
"charge at an unstated voltage: the bank's " + str(bank_energy_mwh) + " mWh becomes " + str(bank_energy_delivered_mwh) + " after conversion," ^0
"against a phone that needs " + str(phone_energy_mwh) + ", so " + str(charges_actually_delivered_per_myriad) + " per ten thousand of a charge arrive where the" ^0
"labels promised " + str(charges_the_labels_seem_to_promise_per_myriad) + ", until the comparison is made in the unit that carries the volts." ^0Python (deterministic transpilation)
pythonbank_label_mah = 10000
bank_cell_volts_tenths = 37
phone_label_mah = 3000
phone_cell_volts_hundredths = 385
conversion_efficiency_percent = 85
charges_the_labels_seem_to_promise_per_myriad = int(bank_label_mah * 10000 / phone_label_mah)
bank_energy_mwh = int(bank_label_mah * bank_cell_volts_tenths / 10)
phone_energy_mwh = int(phone_label_mah * phone_cell_volts_hundredths / 100)
charges_by_energy_before_losses_per_myriad = int(bank_energy_mwh * 10000 / phone_energy_mwh)
bank_energy_delivered_mwh = int(bank_energy_mwh * conversion_efficiency_percent / 100)
energy_lost_in_conversion_mwh = bank_energy_mwh - bank_energy_delivered_mwh
charges_actually_delivered_per_myriad = int(bank_energy_delivered_mwh * 10000 / phone_energy_mwh)
full_charges_actually_delivered = int(charges_actually_delivered_per_myriad / 10000)
charges_the_label_arithmetic_overstates_per_myriad = charges_the_labels_seem_to_promise_per_myriad - charges_actually_delivered_per_myriad
print("power bank : " + str(bank_label_mah) + " mAh at " + str(bank_cell_volts_tenths) + " tenths of a volt, " + str(bank_energy_mwh) + " mWh")
print("phone battery : " + str(phone_label_mah) + " mAh at " + str(phone_cell_volts_hundredths) + " hundredths of a volt, " + str(phone_energy_mwh) + " mWh")
print("")
print("charges, dividing the labels : " + str(charges_the_labels_seem_to_promise_per_myriad) + " per ten thousand of a charge")
print("charges, dividing the energies : " + str(charges_by_energy_before_losses_per_myriad) + " per ten thousand, before losses")
print("conversion through 5 V : " + str(conversion_efficiency_percent) + " percent kept, " + str(energy_lost_in_conversion_mwh) + " mWh lost")
print("charges actually delivered : " + str(charges_actually_delivered_per_myriad) + " per ten thousand, " + str(full_charges_actually_delivered) + " full charges")
print("label arithmetic overstates by : " + str(charges_the_label_arithmetic_overstates_per_myriad) + " per ten thousand of a charge")
print("")
print("the same-unit reasoning")
print(" bank label : " + str(bank_label_mah) + " mAh, accurate")
print(" phone label : " + str(phone_label_mah) + " mAh, accurate")
print(" units : the same, so the division is legitimate")
print(" arithmetic : " + str(charges_the_labels_seem_to_promise_per_myriad) + " per ten thousand, three charges and a third")
print(" intent : how many charges is this")
print(" facts wrong : 0")
print(" verdict : THREE FULL CHARGES AND A THIRD")
print("")
print(" reading both labels accurately is the part done right")
print(" here, and it is why both numbers in the division are the")
print(" numbers the makers printed")
print("")
print("charge is not energy")
print(" what mAh counts : how much charge passed, with no word about")
print(" the voltage it passed at")
print(" what the phone needs : energy, charge times voltage, " + str(phone_energy_mwh) + " mWh")
print(" what the bank holds : " + str(bank_energy_mwh) + " mWh, its charge at its own " + str(bank_cell_volts_tenths) + " tenths of a volt")
print(" what the cable carries : five volts, so the bank steps up and")
print(" the phone steps down, and each step costs")
print(" what arrives : " + str(bank_energy_delivered_mwh) + " mWh, " + str(charges_actually_delivered_per_myriad) + " per ten thousand of a charge")
print(" what the labels compared : two charges at two voltages, as")
print(" if the voltage were the same")
print("")
print("the count")
print(" believed : three charges and a third")
print(" actual : " + str(full_charges_actually_delivered) + " full charges and " + str(charges_actually_delivered_per_myriad - full_charges_actually_delivered * 10000) + " per ten thousand of another")
print(" is either label wrong : no; both are accurate in mAh")
print(" is mAh the right unit to divide : no; it omits the voltage,")
print(" and the two devices do not share one")
print("")
nc_charges_comparing_milliamp_hours_per_myriad = 33333
nc_charges_comparing_watt_hours_after_losses_per_myriad = 27229
nc_charge_the_unit_change_removes_per_myriad = 6104
print("null control - compare energy, not charge")
print(" charges, comparing mAh : " + str(nc_charges_comparing_milliamp_hours_per_myriad) + " per ten thousand")
print(" charges, comparing mWh after losses : " + str(nc_charges_comparing_watt_hours_after_losses_per_myriad) + " per ten thousand")
print(" charge the unit change removes : " + str(nc_charge_the_unit_change_removes_per_myriad) + " per ten thousand")
print(" no label and no battery changed; the quantity that carries")
print(" the voltage was the one divided")
print("")
print("what two accurate mAh labels guarantee")
print(" each device's charge at its own voltage : exactly")
print(" the ratio of the labels is the number of charges : not addressed;")
print(" charge compares only at one voltage, energy is what is")
print(" transferred, and " + str(bank_energy_delivered_mwh) + " mWh delivered into " + str(phone_energy_mwh) + " mWh is " + str(charges_actually_delivered_per_myriad) + " per")
print(" ten thousand of a charge, not " + str(charges_the_labels_seem_to_promise_per_myriad))
print("")
print("a unit that leaves out one of the factors is a number that compares only")
print("with itself; two labels in milliamp-hours agree on everything except the")
print("volts, and the volts are where the charges went")
print("")
print("Both labels are accurate and the division is right - in mAh. But mAh is")
print("charge at an unstated voltage: the bank's " + str(bank_energy_mwh) + " mWh becomes " + str(bank_energy_delivered_mwh) + " after conversion,")
print("against a phone that needs " + str(phone_energy_mwh) + ", so " + str(charges_actually_delivered_per_myriad) + " per ten thousand of a charge arrive where the")
print("labels promised " + str(charges_the_labels_seem_to_promise_per_myriad) + ", until the comparison is made in the unit that carries the volts.")stdout (executed)
textpower bank : 10000 mAh at 37 tenths of a volt, 37000 mWh
phone battery : 3000 mAh at 385 hundredths of a volt, 11550 mWh
charges, dividing the labels : 33333 per ten thousand of a charge
charges, dividing the energies : 32034 per ten thousand, before losses
conversion through 5 V : 85 percent kept, 5550 mWh lost
charges actually delivered : 27229 per ten thousand, 2 full charges
label arithmetic overstates by : 6104 per ten thousand of a charge
the same-unit reasoning
bank label : 10000 mAh, accurate
phone label : 3000 mAh, accurate
units : the same, so the division is legitimate
arithmetic : 33333 per ten thousand, three charges and a third
intent : how many charges is this
facts wrong : 0
verdict : THREE FULL CHARGES AND A THIRD
reading both labels accurately is the part done right
here, and it is why both numbers in the division are the
numbers the makers printed
charge is not energy
what mAh counts : how much charge passed, with no word about
the voltage it passed at
what the phone needs : energy, charge times voltage, 11550 mWh
what the bank holds : 37000 mWh, its charge at its own 37 tenths of a volt
what the cable carries : five volts, so the bank steps up and
the phone steps down, and each step costs
what arrives : 31450 mWh, 27229 per ten thousand of a charge
what the labels compared : two charges at two voltages, as
if the voltage were the same
the count
believed : three charges and a third
actual : 2 full charges and 7229 per ten thousand of another
is either label wrong : no; both are accurate in mAh
is mAh the right unit to divide : no; it omits the voltage,
and the two devices do not share one
null control - compare energy, not charge
charges, comparing mAh : 33333 per ten thousand
charges, comparing mWh after losses : 27229 per ten thousand
charge the unit change removes : 6104 per ten thousand
no label and no battery changed; the quantity that carries
the voltage was the one divided
what two accurate mAh labels guarantee
each device's charge at its own voltage : exactly
the ratio of the labels is the number of charges : not addressed;
charge compares only at one voltage, energy is what is
transferred, and 31450 mWh delivered into 11550 mWh is 27229 per
ten thousand of a charge, not 33333
a unit that leaves out one of the factors is a number that compares only
with itself; two labels in milliamp-hours agree on everything except the
volts, and the volts are where the charges went
Both labels are accurate and the division is right - in mAh. But mAh is
charge at an unstated voltage: the bank's 37000 mWh becomes 31450 after conversion,
against a phone that needs 11550, so 27229 per ten thousand of a charge arrive where the
labels promised 33333, until the comparison is made in the unit that carries the volts.Trace event types
eml:run:starteml:assigneml:outputeml:run:done