Skip to content

E-series snap

IEC 60063 preferred numbers. The realizable component value series for resistors, capacitors, and inductors. We support E6 / E12 / E24 / E48 / E96 / E192 for snapping continuous-value optimizer output to something you can actually buy.

Choice guide

Series Tolerance grade When to use
E6 ±20% Pre-selection only; almost never realizable
E12 ±10% Hobby / low-precision power supplies
E24 ±5% General passive components
E48 ±2% RF inductors (Coilcraft 0402HP standard)
E96 ±1% Precision resistors, RF capacitors
E192 ±0.5% Reference / metrology grade

API

E-series component value snapping (E24, E96, E192).

When a synthesis or optimization tool produces a non-realizable component value (e.g. 4.137 nH), this module snaps it to the nearest value in a manufacturable preferred-number series and reports the percent error.

Reference: IEC 60063 preferred numbers.

ESeries

Bases: StrEnum

SnapResult

Bases: NamedTuple

snap_to_eseries(value, series=ESeries.E24)

Snap value to the nearest preferred number in the given series.

Returns the snapped value, signed percent error (snapped - value) / value * 100, and the decade used.

snap_to_eseries(4.137e-9, ESeries.E24) SnapResult(snapped=3.9e-09, error_pct=-5.728...)

Source code in packages/rf-mcp-common/src/rf_mcp_common/ecomp.py
def snap_to_eseries(value: float, series: ESeries | str = ESeries.E24) -> SnapResult:
    """Snap ``value`` to the nearest preferred number in the given series.

    Returns the snapped value, signed percent error
    ``(snapped - value) / value * 100``, and the decade used.

    >>> snap_to_eseries(4.137e-9, ESeries.E24)
    SnapResult(snapped=3.9e-09, error_pct=-5.728...)
    """
    if value <= 0:
        raise ValueError(f"value must be positive, got {value}")
    if isinstance(series, str):
        series = ESeries(series)
    table = _E_TABLES[series]

    decade = math.floor(math.log10(value))

    # Find nearest mantissa in this and adjacent decades.
    candidates: list[tuple[float, int]] = []
    for d_off in (-1, 0, 1):
        for m in table:
            candidates.append((m * 10 ** (decade + d_off), decade + d_off))

    snapped, used_decade = min(candidates, key=lambda c: abs(c[0] - value))
    err = (snapped - value) / value * 100.0
    return SnapResult(snapped=snapped, error_pct=err, decade=used_decade)