# D46-F01-A08 — Basic EPS

> **Domain:** D46 — Earnings and Per-Share Analytics  
> **Family:** D46-F01 — Earnings and Share Foundations  
> **Status:** Article-ready  
> **Last reviewed:** 2026-07-22

## Executive summary

Basic earnings per share allocates earnings available to ordinary shareholders across the weighted-average ordinary shares outstanding during the reporting period:

\[
\text{Basic EPS} =
\frac{\text{earnings available to ordinary shareholders}}
{\text{weighted-average ordinary shares}}
\]

The arithmetic is one division. The accounting and data engineering around it are not. Numerator attribution, preference dividends, participating securities, time weighting, treasury-share exclusion, retrospective capital-event restatements, unit scales, rounding, and finality all affect whether the number is reproducible.

This package implements a strict integration boundary for those prepared components. It supports IFRS, US GAAP, and explicitly declared other policies without pretending the frameworks are interchangeable.

## Problem and financial relevance

Total earnings do not state how much belongs to each ordinary share. Basic EPS supplies that per-share view using only the current ordinary-share capital structure—not the hypothetical effects of options, warrants, or convertibles.

[IAS 33](https://www.ifrs.org/issued-standards/list-of-standards/ias-33-earnings-per-share.html/) describes the numerator as earnings and the denominator as weighted-average shares. For consolidated IFRS financial statements, the EPS numerator is based on profit or loss attributable to ordinary equity holders of the parent. Under [US GAAP Topic 260](https://asc.fasb.org/260/tableOfContent), participating securities can require a two-class allocation when they share in dividends or undistributed earnings. The frameworks are declared separately; this package does not blend their policies.

An implementation must preserve the audit trail:

- which entity, period, framework, and statement scope were used;
- how the numerator was attributed and adjusted;
- whether participating-security allocations were prepared;
- how the denominator was time-weighted and restated;
- what units and rounding policy were used;
- whether the source data is final.

## Learning contract

### Audience and prerequisites

This topic is for accounting-platform, financial-data, and analytics developers. It assumes signed arithmetic, reporting-period concepts, and familiarity with A01–A07 in this family.

### Learning objectives

After completing this topic, the reader can:

- state and derive the Basic EPS fraction;
- distinguish Basic EPS from diluted EPS;
- define a framework-aware numerator and denominator boundary;
- prevent unit-scale and floating-point errors;
- implement exact half-even and half-up rounding in Python and TypeScript;
- test profit, loss, break-even, participating-allocation, and invalid-contract cases.

## Definitions and terminology

| Term | Definition |
|---|---|
| Ordinary shareholders | Holders of the residual equity class used for the per-share measure. |
| Earnings available | Attributable profit or loss after preference, participation, and other declared numerator adjustments. |
| Weighted-average shares | Ordinary shares outstanding, weighted for the portion of the reporting period they were outstanding and restated where required. |
| Participating security | An instrument with rights to dividends or undistributed earnings that may require an earnings allocation. |
| Basic EPS | Earnings available divided by weighted-average ordinary shares, before dilutive potential ordinary shares. |
| Loss per share | A negative Basic EPS; it is a valid result, not a denominator failure. |
| Unit scale | Multiplier converting reported units such as “thousands” into base currency units or shares. |

## Scope and variants

The canonical algorithm consumes an **attribution-complete numerator** and a **restatement-complete denominator**. It exposes four numerator lines so a reconciliation remains visible. The stable field name `profit_loss_attributable_to_owners` is IFRS-shaped; under US GAAP, it carries the declared framework-appropriate net-income starting line, and `numerator_policy` must make that mapping explicit:

\[
E_r=P-A_p-A_s+A_o
\]

where \(E_r\) is earnings available in reported units, \(P\) is the framework-appropriate profit or loss starting line, \(A_p\) is the preference-dividend adjustment, \(A_s\) is the participating-security allocation, and \(A_o\) is a signed other adjustment.

Included:

- positive, zero, and negative earnings;
- IFRS, US GAAP, and a declared other framework;
- consolidated and separate statement scopes;
- explicit earnings and share scales;
- exact decimal input and fixed-decimal output;
- half-even and half-up rounding;
- final and provisional results.

Excluded:

- computing attributable earnings from a full income statement;
- deriving preference dividends or two-class allocations;
- constructing weighted-average shares from transaction dates;
- deriving split, bonus, consolidation, or rights-issue factors;
- diluted EPS and antidilution tests;
- presentation of continuing/discontinued-operation subtotals;
- compliance conclusions for a particular issuer.

## Input data contract

All numeric inputs are canonical decimal **strings**, not binary floating-point numbers. Grammar: `-?(0|[1-9][0-9]*)(.[0-9]+)?`, at most 30 digits and 12 fractional digits.

| Field | Type | Unit | Constraints |
|---|---|---|---|
| `entity_id` | string | identifier | Non-empty stable reporting-entity ID. |
| `period_start`, `period_end` | string | date | Real `YYYY-MM-DD` dates; start ≤ end. |
| `as_of` | string | timestamp | Real [RFC 3339](https://www.rfc-editor.org/rfc/rfc3339) timestamp with offset. |
| `accounting_framework` | enum | policy | `IFRS`, `US_GAAP`, or `OTHER_DECLARED`. |
| `statement_scope` | enum | policy | `consolidated` or `separate`. |
| `currency` | string | code | Three uppercase letters. |
| `profit_loss_attributable_to_owners` | decimal string | reported earnings units | Signed framework-appropriate starting line. IFRS uses profit/loss attributable to owners; US GAAP mapping must be declared in `numerator_policy`. |
| `preference_dividend_adjustment` | decimal string | reported earnings units | Non-negative deduction prepared upstream. |
| `participating_security_allocation` | decimal string | reported earnings units | Non-negative deduction prepared upstream. |
| `other_numerator_adjustment` | decimal string | reported earnings units | Signed addition; policy explains it. |
| `earnings_scale` | decimal string | multiplier | Positive; for example `1000` for thousands. |
| `weighted_average_ordinary_shares` | decimal string | reported share units | Strictly positive. |
| `share_scale` | decimal string | multiplier | Positive; for example `1000000` for millions. |
| `numerator_policy` | string | policy | Non-empty attribution/reconciliation description. |
| `denominator_policy` | string | policy | Non-empty time-weighting/restatement description. |
| `numerator_is_attribution_complete` | boolean | control | Must be `true`; prevents partial attribution. |
| `denominator_is_restatement_complete` | boolean | control | Must be `true`; prevents unadjusted comparisons. |
| `is_final` | boolean | state | Controls final/provisional output. |
| `decimal_places` | integer | digits | 0–12. |
| `rounding_mode` | enum | policy | `half_even` or `half_up`. |

Missing values are rejected. No implicit defaults are applied. A null or zero denominator is invalid; a negative numerator is valid.

### Time, source, and licensing semantics

- `period_start` and `period_end` identify the accounting period; they are dates, not market-session timestamps.
- `as_of` records when this input version was known to the system. It is not silently replaced by the period end or filing date.
- A production record should also retain source document ID, filing or revision ID, ingestion timestamp, and provider field lineage outside this calculation boundary.
- The synthetic fixtures are redistributable with this repository. The cited FMAO example is drawn from a public SEC filing. Third-party provider values are not embedded unless display and redistribution rights are confirmed.

## Output contract

| Field | Type | Meaning | Invariant |
|---|---|---|---|
| `metric` | literal | Metric identity | `basic_earnings_per_ordinary_share`. |
| identity/policy fields | strings | Entity, period, `as_of`, framework, scope, currency, numerator policy, and denominator policy | Echo validated values. |
| `earnings_available_to_ordinary_shareholders` | decimal string | Exact numerator in base currency units | No unnecessary trailing zeros. |
| `weighted_average_ordinary_shares_base` | decimal string | Exact denominator in base shares | Greater than zero. |
| `basic_eps` | decimal string | Rounded currency per ordinary share | Exactly `decimal_places` digits. |
| `rounding_adjusted` | boolean | Whether division discarded a non-zero remainder | Independent of increment direction. |
| `direction` | enum | `profit`, `loss`, or `break_even` | Follows numerator sign. |
| `status` | enum | `final` or `provisional` | Follows `is_final`. |

## Mathematical formulation

Let:

\[
E_r=P-A_p-A_s+A_o
\]

\[
E_o=E_r \times S_e
\]

\[
W_o=W_r \times S_w
\]

\[
\boxed{\text{Basic EPS}=\frac{E_o}{W_o}}
\]

### Symbol table

| Symbol | Meaning | Unit |
|---|---|---|
| \(P\) | Framework-appropriate profit or loss starting line, with mapping declared in policy | Reported earnings units |
| \(A_p\) | Preference-dividend/equivalent deduction | Reported earnings units |
| \(A_s\) | Participating-security allocation | Reported earnings units |
| \(A_o\) | Signed other numerator adjustment | Reported earnings units |
| \(E_r\) | Earnings available to ordinary shareholders before unit scaling | Reported earnings units |
| \(S_e\) | Earnings unit multiplier | Currency units / reported unit |
| \(E_o\) | Earnings available to ordinary shareholders | Base currency units |
| \(W_r\) | Reported weighted-average ordinary shares | Reported share units |
| \(S_w\) | Share unit multiplier | Shares / reported unit |
| \(W_o\) | Weighted-average ordinary shares | Base shares |

## Algorithm steps

1. Validate identity, dates, timestamp, framework, scope, currency, policies, and completeness flags.
2. Parse bounded canonical decimals into integer coefficients plus decimal scales.
3. Reconcile the reported numerator.
4. Apply earnings and share unit multipliers.
5. Divide the exact integer-backed decimals.
6. Round to fixed decimal places using the declared mode.
7. Return exact reconciliations, sign, finality, and rounding diagnostics.

## Pseudocode

See [`pseudocode/basic-eps.txt`](./pseudocode/basic-eps.txt).

```text
reported_numerator = profit - preference - participating + other
numerator = reported_numerator × earnings_scale
denominator = weighted_average_shares × share_scale
basic_eps = round_fixed(numerator ÷ denominator, places, mode)
```

## Worked examples

### 1. Build the denominator upstream, then integrate it

Basic EPS consumes a completed weighted-average denominator, but the integration boundary is easier to trust when the construction remains visible. Consider this synthetic calendar-year share timeline; detailed weighting policy belongs to `D46-F01-A03`.

| Interval | Ordinary shares outstanding | Fraction of year | Contribution |
|---|---:|---:|---:|
| 1 January–31 March | 12,000,000 | 3/12 | 3,000,000 |
| 1 April–30 September, after a 3,000,000-share issue | 15,000,000 | 6/12 | 7,500,000 |
| 1 October–31 December, after a 1,000,000-share repurchase | 14,000,000 | 3/12 | 3,500,000 |
| **Weighted-average ordinary shares** |  |  | **14,000,000** |

If earnings available to ordinary shareholders are USD 28,000,000, the Basic EPS engine receives the completed denominator and calculates:

\[
\frac{28{,}000{,}000}{14{,}000{,}000}=2.00\ \text{USD/share}
\]

Using the closing balance of 14,000,000 happens to give the same answer in this constructed case only because the period weights offset. That coincidence is not a rule; the timeline, not the closing count, establishes the denominator.

### 2. Canonical scale-safe calculation

Assume the financial statements report earnings and shares in thousands:

| Component | Reported value | Base value |
|---|---:|---:|
| Profit attributable to owners | 12,500 | USD 12,500,000 |
| Preference adjustment | (500) | USD (500,000) |
| Participating allocation | — | — |
| Other adjustment | — | — |
| Earnings available | 12,000 | USD 12,000,000 |
| Weighted-average shares | 6,000 | 6,000,000 shares |

\[
\text{Basic EPS}=
\frac{12{,}000\times1{,}000}{6{,}000\times1{,}000}
=\frac{12{,}000{,}000}{6{,}000{,}000}
=2.0000\ \text{USD/share}
\]

Independent check: \(2.0000 \times 6{,}000{,}000=12{,}000{,}000\).

### 3. Historical filed case: FMAO, second quarter of 2025

Farmers & Merchants Bancorp, Inc. filed its Form 10-Q for the period ended 2025-06-30 on 2025-08-04. Its [Note 6 EPS reconciliation](https://www.sec.gov/Archives/edgar/data/792966/000095017025101771/R16.htm) reports the following for the three months ended 2025-06-30. These are issuer-filed facts, not estimates:

| Filed component | Filed value |
|---|---:|
| Net income | USD 7,710 thousand |
| Distributed earnings allocated to participating securities | USD 38 thousand deduction |
| Undistributed earnings allocated to participating securities | USD 59 thousand deduction |
| Net earnings available to common shareholders | USD 7,613 thousand |
| Weighted-average common shares including participating securities | 13,720,339 |
| Average unvested restricted shares | 172,894 deduction |
| Weighted-average common shares outstanding | 13,547,445 |
| Basic and diluted EPS | USD 0.56 |

For this US GAAP case, the issuer's `Net income` line is the framework-appropriate starting amount mapped into the stable input field; the numerator policy records that choice. The following is our reproducible calculation from the filed lines:

\[
(7{,}710-38-59)\times1{,}000=7{,}613{,}000
\]

\[
13{,}720{,}339-172{,}894=13{,}547{,}445
\]

\[
7{,}613{,}000\div13{,}547{,}445
=0.5619509804\ldots
\longrightarrow 0.56
\]

This case demonstrates numerator attribution and denominator reconciliation. It does not establish earnings growth, causality, or investment merit.

#### Provider comparison requires a separate clearance gate

A data-provider row can use different field semantics, mappings, normalization, or revision states from the issuer filing. A production review should compare the values privately, retain the provider's observation time and field definitions, and publish the result only when display and redistribution rights are confirmed. This public package therefore uses the SEC filing as the reproducible case and does not expose a provider snapshot. See the [evidence note](./research/FMAO-2025-Q2-EVIDENCE.md).

## Visual explanations

The first flow shows why the formula is last, not first:

```mermaid
flowchart LR
  A["Reporting identity and period"] --> B{"Framework and scope declared?"}
  B -- "No" --> X["Reject"]
  B -- "Yes" --> C{"Numerator attribution complete?"}
  C -- "No" --> X
  C -- "Yes" --> D{"Denominator restatement complete?"}
  D -- "No" --> X
  D -- "Yes" --> E["Apply explicit unit scales"]
  E --> F["Divide exact decimals"]
  F --> G["Round by declared policy"]
  G --> H["Basic EPS plus audit diagnostics"]
```

The reconciliation boundary is separate from dilution:

```mermaid
flowchart TB
  P["Profit or loss attributable to owners"] --> N["Less preference adjustment"]
  S["Participating-security allocation"] --> N
  O["Signed other adjustment"] --> N
  N --> E["Earnings available to ordinary shareholders"]
  W["Restated weighted-average ordinary shares"] --> B["Basic EPS"]
  E --> B
  Q["Potential ordinary shares"] --> D["Diluted EPS — separate topic"]
  B -. "starting point" .-> D
```

The fraction anatomy below ties the canonical numerator, denominator, scales, and result together. Notice that the quotient is shown only after both ledgers are complete.

![Basic EPS fraction anatomy showing the reconciled USD 12 million numerator divided by six million weighted-average shares to produce USD 2.0000 per share.](./visuals/static/basic-eps-fraction.svg)

The comparison below holds earnings constant. It isolates denominator sensitivity without claiming that a lower or higher EPS is automatically better.

![Two synthetic companies with USD 12 million of earnings: six million weighted-average shares produce USD 2.00 EPS, while eight million produce USD 1.50.](./visuals/static/same-earnings-different-shares.svg)

Interactive asset:

- [`visuals/animated/basic-eps-lab.html`](./visuals/animated/basic-eps-lab.html) — guided scenarios for profit, loss, two-class allocation, rounding, and the cited filing reconciliation, with the provider-publication boundary stated separately.

## Implementation guide

### Python

```python
from basic_eps import calculate_basic_eps
result = calculate_basic_eps(payload)
print(result.basic_eps)
```

### TypeScript

```ts
import {calculateBasicEps} from "./basicEps.ts";
const result = calculateBasicEps(payload);
console.log(result.basic_eps);
```

Both implementations are dependency-free and use arbitrary-precision [Python integers](https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex) and [ECMAScript BigInt](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-bigint-objects). They do not convert accounting amounts to binary floating point. Runtime is \(O(d)\) in the number of decimal digits and auxiliary space is \(O(d)\); contract limits keep \(d\) bounded.

## Testing and validation

Shared fixtures cover:

- the canonical thousands example;
- the synthetic weighted-share-timeline integration result;
- the cited FMAO filing reconciliation;
- loss per share and provisional state;
- a US GAAP participating-security allocation;
- half-even and negative half-up ties;
- break-even earnings;
- differing earnings/share scales;
- invalid dates, timestamps, enums, policies, flags, decimals, scales, and denominators;
- input immutability and cross-language parity.

Run:

```powershell
python -B -m unittest discover -s tests -p "test_basic_eps.py" -v
npx.cmd --yes tsx --test tests/basicEps.test.ts
```

## Edge cases

| Case | Expected behavior | Reason |
|---|---|---|
| Negative numerator | Negative Basic EPS | Loss per share is meaningful. |
| Zero numerator | Exact zero | Break-even is not missing data. |
| Zero or negative denominator | Reject | Per-share division is undefined or nonsensical. |
| Partial numerator attribution | Reject | Total-owner earnings may not equal ordinary-holder earnings. |
| Unrestated denominator | Reject | Splits/bonus events can break comparability. |
| Participating allocation is zero | Accept with declared policy | Zero may be correct, but remains explicit. |
| Units in different scales | Apply both multipliers | Prevents 1,000× or 1,000,000× errors. |
| Exact rounding tie | Apply declared mode | Makes cross-language results deterministic. |
| Provisional source | Return provisional | Avoids overstating publication finality. |

## Failure modes and limitations

- A mathematically correct quotient can still be accounting-wrong if the upstream attribution or share ledger is wrong.
- A provider's EPS, numerator, and share-count fields may use different definitions or revision states and may not reconstruct one another.
- The general `other_numerator_adjustment` needs a documented sign convention and review.
- A single EPS value does not reveal earnings quality, cash conversion, cyclicality, or capital intensity.
- Comparisons require compatible accounting policies, periods, capital-event restatements, and continuing-operation definitions.
- Basic EPS ignores dilution by design; it must not be presented as a fully diluted ownership outcome.
- This educational implementation does not replace licensed standards or professional accounting judgment.

## Real-world use cases

- filing and disclosure preparation pipelines;
- statement-to-XBRL reconciliation controls;
- financial data normalization and quality checks;
- historical EPS restatement pipelines;
- valuation and screening inputs, with separate quality controls;
- audit-friendly teaching and model validation.

## Related catalog topics

- `D46-F01-A01` — prepares earnings attributable to ordinary shareholders.
- `D46-F01-A02` — prepares preference-dividend numerator adjustments.
- `D46-F01-A03` — computes weighted-average ordinary shares.
- `D46-F01-A04` — excludes treasury shares.
- `D46-F01-A05` — restates splits and consolidations.
- `D46-F01-A06` — restates bonus issues.
- `D46-F01-A07` — applies rights-issue bonus factors.
- `D46-F02` — diluted EPS mechanics and potential ordinary shares.

## References

See [REFERENCES.md](./REFERENCES.md). The real-case filing facts, derived arithmetic, provider-publication boundary, and limitations are preserved separately in [`research/FMAO-2025-Q2-EVIDENCE.md`](./research/FMAO-2025-Q2-EVIDENCE.md).
