FN-ERF.PRECISE-001: Below 0.5, ERF is a stored (4, 5) rational from a table not yet identified
Detail for matching Excel's bits · measured · recorded 2026-11-04
With RN(v) meaning v rounded to 64 bits on the x87 unit and then stored to binary64, ERF.PRECISE for |x| < 0.5 is x*N(t)/D(t) with t = RN(x*x), p = RN(x*N), y = RN(p/D), and N and D Horner sums in t in which every product and every sum is RN. N has degree 4 and D degree 5, and the coefficients read off Excel's answers, order 0 upward, are N: 0x3ff1df5e70c7956b, 0x3fc201d8627a7d2c, 0x3fa6f289d165b303, 0x3f5d93a5813e372c, 0x3f2932767df264b2; D: 0x3fefada15778ece6, 0x3fdd191aca8d2499, 0x3fb79f85ba68803e, 0x3f856de5da86af12, 0x3f4609751b5b6488, 0x3ef4f20a473a5ab0. The rational stops at 0.5 itself. It equals erf to a flat 9E-17 up to 0.5, and its error climbs at once beyond, so 0.5 is its design interval and not Cody's 0.46875. No published table has been matched: Cody's 1969 rational is refuted by its linear terms, and Cephes has the same shape with different ratios. Evidence record EV-DIST-0026, which predates this note, attributes ERF.PRECISE and ERFC.PRECISE to the a < 1 branches of the NSWC GRATIO routine and says no coefficient table exists; below 0.5 this note replaces that attribution. Because every step rounds, answers need not be correctly rounded: of the 654 recorded rows of build 20131 in [0.25, 0.5), 400 differ from the correctly rounded erf, by up to 3 units, and small arguments can be 1 unit high, as below. ERFC and ERFC.PRECISE below 0.5 are 1 less this value, and GAUSS at tiny arguments takes half of it at its stored z/sqrt(2).
| Call and input route | Inputs | Excel | Correct value | Recorded in |
|---|---|---|---|---|
ERF.PRECISE(0.4524739583333333)cell-value2 | x: 0.45247395833333330x3fdcf55555555555 | 0.47775901073519780x3fde939a879e86f6 | 0.47775901073519760x3fde939a879e86f3 | Excel 16.0 build 20131, platform and bitness not recorded, AMD Ryzen 7 4800H |
ERF.PRECISE(9.094947017729282e-13)cell-value2 | x: 9.094947017729282e-130x3d70000000000000 | 1.0262548740643186e-120x3d720dd750429b6e | 1.0262548740643184e-120x3d720dd750429b6d | Excel 16.0 build 20131, platform and bitness not recorded, AMD Ryzen 7 4800H |
ERF.PRECISE(9.999999999999998e-11)cell-value2 | x: 9.999999999999998e-110x3ddb7cdfd9d7bdb9 | 1.1283791670955125e-100x3ddf044332d68160 | 1.1283791670955123e-100x3ddf044332d6815f | Excel 16.0 build 20131, platform and bitness not recorded, AMD Ryzen 7 4800H |
Correct value: mpmath erf at 800 bits from the binary64 input, correctly rounded.
Correct value: mpmath erf at 800 bits from the binary64 input, correctly rounded.
Correct value: mpmath erf at 800 bits from the binary64 input, correctly rounded.
Basis: All 618,225 recorded ERF.PRECISE rows with |x| < 0.5 match; they were only scored, never used to read the coefficients, and ERFC and ERFC.PRECISE match every recorded row in that range. Two fresh sets of 60,000 random doubles below 0.5 (Excel build 20527) match 59,996 and 59,982; the second was asked after the constants were fixed, and 17 of its 18 misses are in [0.25, 0.5). With every step stored, 223 of 38,000 rows at 19 sites stay unexplained; the other store placements leave 568 to 1,244. 2,000 consecutive doubles below 0.5 match 1,988, and 2,000 from 0.5 up match 858, chance level, which places the cut.
Inferred: That the legacy ERF(x) shares this body is inferred: ERF.PRECISE, ERFC and ERFC.PRECISE rows were scored in full, and for ERF itself the record holds only nine non-zero single-argument inputs below 0.5 (build 19929), all equal to the rational.
Open: The last bits of the coefficients of order 3 and above. Orders 0 and 1 are exact: one unit off in a linear term breaks 500 to 1,100 of 160,000 rows. Order 2 sits at the minimum of the same scan. Higher orders are good to the level that shows, about 0.15% of rows above 0.25.
Open: The source table. Hart's ERF tables remain unchecked.
Open: Which branch owns x = 0.5: there the rational and a correctly rounded erf give the same bits.
Open: Subnormal arguments: Excel reads a subnormal written to a cell back as 0, so they cannot be asked that way.
Evidence and capture sources
- ExcelFunctionsHandbook · content/notes/evidence/2026-11-04/erf-EVIDENCE-round3.md b5d84a80a5a4640eca9ce04f232c0bc115503f34 · research write-up: how the rational was read, the checks, the final constants
- ExcelFunctionsHandbook · content/notes/evidence/2026-11-04/erf-EVIDENCE-round2.md b5d84a80a5a4640eca9ce04f232c0bc115503f34 · earlier round: the structure, the refutation of Cody, the edge bisection
- ExcelFunctionsHandbook · content/notes/evidence/2026-11-04/erf-EVIDENCE.md b5d84a80a5a4640eca9ce04f232c0bc115503f34 · first write-up; its Cody attribution is withdrawn
- DnaCalc · crates/calc-func/src/ported/normal_dist_common.rs 36a7f3d7aa607bcea8b75bd65fb352beec657817 · erf_approx, ERF_N, ERF_D the rational in the product; the commit message carries the row counts
- CalcFunc-Evidence · cache/oracle/build-20131/ERF.PRECISE.jsonl.gz 4d5320dfdc385354469b4d506153357bb932ab08 · line 1219, key ERF.PRECISE|0x3fdcf55555555555
- CalcFunc-Evidence · cache/oracle/build-20131/ERF.PRECISE.jsonl.gz 4d5320dfdc385354469b4d506153357bb932ab08 · line 2115, key ERF.PRECISE|0x3d70000000000000
- CalcFunc-Evidence · cache/oracle/build-20131/ERF.PRECISE.jsonl.gz 4d5320dfdc385354469b4d506153357bb932ab08 · line 209, key ERF.PRECISE|0x3ddb7cdfd9d7bdb9