Excel 16.0 build 20430
Windows, 64-bit, CPU not recorded
1,205 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.
Financial functions
Matches all 1,210 recorded answers
Recorded: 1,205 in the answer bank and 5 workbook cells. How we measure this · See the Rust code
| Language | Name in Excel |
|---|---|
| Arabic | PDURATION |
| Bulgarian | PDURATION |
| Czech | PDURATION |
| Danish | PVARIGHED |
| German | PDURATION |
| Greek | PDURATION |
| English (Australia) | PDURATION |
| English (United Kingdom) | PDURATION |
| English (United States) | PDURATION |
| Spanish | P.DURACION |
| Estonian | PDURATION |
| Finnish | KESTO.JAKSO |
| French | PDUREE |
| Hebrew | PDURATION |
| Croatian | PDURATION |
| Hungarian | KAMATÉRZ.PER |
| Indonesian | PDURATION |
| Italian | PDURATION |
| Japanese | PDURATION |
| Korean | PDURATION |
| Lithuanian | PDURATION |
| Latvian | PDURATION |
| Norwegian | PVARIGHET |
| Dutch | PDUUR |
| Polish | O.CZAS.TRWANIA |
| Portuguese (Brazil) | PDURATION |
| Portuguese (Portugal) | PDURAÇÃO |
| Romanian | PDURATION |
| Russian | ПДЛИТ |
| Slovak | PDURATION |
| Slovenian | PDURATION |
| Serbian (Latin) | PDURATION |
| Swedish | PLÖPTID |
| Thai | PDURATION |
| Turkish | PSÜRE |
| Ukrainian | PDURATION |
| Vietnamese | PDURATION |
| Chinese (Simplified) | PDURATION |
| Chinese (Hong Kong) | PDURATION |
| Chinese (Traditional) | PDURATION |
Names from Microsoft's support site.
PDURATION(rate, pv, fv)
PDURATION(rate,pv,fv) returns the number of periods for a positive amount to grow to a positive target at a positive constant rate, without intervening payments.
=PDURATION(0.25,64,100) is about 2: 64*1.25^2=100. The result can be fractional; a target below the starting value gives a negative mathematical duration at a positive rate.
The documented arguments must all be positive; invalid values give #NUM!, and invalid data types give #VALUE!. A target below the starting amount is still permitted and gives a negative duration at a positive rate.
The current helper has no equal-value shortcut before its logarithm calculation. Equal positive amounts normally give zero, but a rate so small that stored 1+rate equals one makes the denominator zero; the resulting nonfinite calculation gives #NUM!. Replacing the denominator by a stable log1p(rate) would change this boundary behaviour.
Let D denote ordinary nearest/even binary64 storage. The current graph uses three separate public worksheet LN results:
Lf=LN(fv) and Lp=LN(pv), each stored to binary64.base=D(1+rate) and obtain the stored Lb=LN(base).difference=D(Lf-Lp), then duration=D(difference/Lb). Return #NUM! if the result is nonfinite.For rate 0.25, pv 64 and fv 100, the current x87-LN reconstruction gives these intermediate numbers:
| Stage | Stored binary64 value |
|---|---|
| LN(100) | 4.605170185988092 |
| LN(64) | 4.1588830833596715 |
| Difference | 0.4462871026284203 |
| LN(1.25) | 0.22314355131420976 |
| Division | 2.0000000000000036 |
The mathematical duration is exactly two; the table is a worked reconstruction of the cited operation tree, rather than an additional Excel measurement. Its split logarithms can lose low bits in the subtraction. Do not first compute fv/pv and take one logarithm: the source’s retained 80-input control distinguishes that ratio-log candidate from the split graph. The LN instruction approximation and transfer to other CPUs remain separately scoped.
Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.
PDURATION · 3 lines · calc-func/src/catalogue/financial.rs on GitHub12 pduration_fn "PDURATION" (3, 3) [V "rate", V "pv", V "fv"] |s, a, sv| {
tv_out(s, tv::pduration(num(s, a, 0)?, num(s, a, 1)?, num(s, a, 2)?))
}
pduration · 21 lines · calc-func/src/ported/financial_time_value_family.rs on GitHubpub fn pduration(
periodic_rate: f64,
present_value: f64,
future_value: f64,
) -> Result<f64, FinancialError> {
validate_finite(&[periodic_rate, present_value, future_value])?;
if periodic_rate <= 0.0 || present_value <= 0.0 || future_value <= 0.0 {
return Err(FinancialError::Num);
}
// Live Excel 16.0 b20326 Value2: PDURATION is the split worksheet-LN
// graph (LN(fv)-LN(pv))/LN(1+rate), not LN(fv/pv)/LN(1+rate).
// 80/80 exact on a fresh mixed grid; the fused-ratio LN form is 20/80.
use crate::ported::excel_numeric::excel_log;
let result =
(excel_log(future_value) - excel_log(present_value)) / excel_log(1.0 + periodic_rate);
if result.is_finite() {
Ok(result)
} else {
Err(FinancialError::Num)
}
}
tv_out catalogue/financialvalidate_finite ported/financial_time_value_familyNo implementation has been published with a Handbook test suite for this function.
The recorded environments below distinguish a reading from a same-input comparison. Counts describe captured inputs in each environment; overlapping captures and comparisons are not totals of unique worksheet calls.
| Excel 16.0 build | Platform and CPU | Captured inputs |
|---|---|---|
| 20430 | Windows, 64-bit, CPU not recorded | 1,205 |
The record contains no same-input comparison between these environments. Reading different inputs on different builds does not establish either a version change or cross-build agreement.
Recorded environments and comparison details.
Windows, 64-bit, CPU not recorded
1,205 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.
NPER includes periodic payments; RRI solves a growth rate from a period count; FV solves the resulting balance.
No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents