Excel 16.0 build 20131
Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics
789 captured inputs are indexed for this environment. Capture dates: 2026-07-11 to 2026-07-23. This is a reading count, not a comparison with another build.
Financial functions
Known larger differences on 2 of 2,567 recorded answers
Of 2,567 recorded answers (2,561 in the answer bank and 6 workbook cells), 2 do not match: 1 differ by more than 16 ULP, 1 differ by at most 16 ULP. How we measure this · See the Rust code
| Language | Name in Excel |
|---|---|
| Arabic | FV |
| Bulgarian | FV |
| Czech | BUDHODNOTA |
| Danish | FV |
| German | ZW |
| Greek | FV |
| English (Australia) | FV |
| English (United Kingdom) | FV |
| English (United States) | FV |
| Spanish | VF |
| Estonian | FV |
| Finnish | Tuleva_arvo |
| French | FV |
| Hebrew | FV |
| Croatian | FV |
| Hungarian | JBÉ |
| Indonesian | FV |
| Italian | VAL.FUT |
| Japanese | FV |
| Korean | FV |
| Lithuanian | FV |
| Latvian | FV |
| Norwegian | SLUTTVERDI |
| Dutch | TW |
| Polish | FV |
| Portuguese (Brazil) | VF |
| Portuguese (Portugal) | VF |
| Romanian | FV |
| Russian | БС |
| Slovak | FV |
| Slovenian | FV |
| Serbian (Latin) | FV |
| Swedish | SLUTVÄRDE |
| Thai | FV |
| Turkish | GD |
| Ukrainian | Мв |
| Vietnamese | FV |
| Chinese (Simplified) | FV |
| Chinese (Hong Kong) | FV |
| Chinese (Traditional) | FV |
Names from Microsoft's support site.
FV(rate, nper, pmt, [pv], [type])
FV(rate,nper,pmt,[pv],[type]) returns the final balance of a constant-rate investment or loan with equal periodic payments. Present value pv and type default to zero. Type zero pays at period end; type one at the beginning.
Use a rate per payment period and a matching number of periods. Cash paid out is negative and cash received positive. For nonzero rate the mathematical balance equation is pv*(1+r)^n+pmt*(1+r*type)*((1+r)^n-1)/r+fv=0.
=FV(0.25,2,-100,-1000,0) returns about 1787.5. The starting thousand grows to 1562.5. The first hundred earns one period of interest and the second earns none, adding 225.
=FV(0.25,2,-100,-1000,1) returns about 1843.75: moving both payments one period earlier changes their combined accumulation to 281.25. At zero rate, =FV(0,4,-250) returns 1000.
A zero payment and an omitted payment position are useful for lump-sum growth; supply pv in that case. For example, FV(0.25,2,,-1000) describes the starting balance alone.
The current wrapper truncates type, choosing ending timing for zero and beginning timing for other truncated values. Microsoft defines only zero and one. Treat the broader code rule as an implementation fact rather than a documented promise.
The newer cited helper distinguishes exactly zero rate from a tiny nonzero rate. A stored growth factor can round to one and cancel the nonzero-rate annuity numerator. FV therefore does not inherit PMT’s cancellation-corrected discount body. The current POWER route also permits some nonpositive-base cases with integer periods, whereas PMT has a separate domain guard.
The recipe below cites a later source revision than the separately pinned interactive calculator. A preview result can still follow an earlier route at the changed boundaries.
Let D mean ordinary nearest/even binary64 storage and R mean a 64-bit-significand operation followed by a binary64 store. The current R31 composition is:
base=R(1+r), then obtain g=POWER(base,n) through the public worksheet POWER kernel. Its integer and fractional paths remain separate; this is not an unconditional EXP/LN replacement.term=n. Otherwise form difference=D(g-1), store end_term=R(difference/r), then store term=R(end_term*timing_factor). The current timing factor is one for ending payments and D(1+r) for beginning payments. Division comes before timing multiplication.present=R(pv*g) and payments=R(pmt*term).combined=R(present+payments) and negate it. Apply the finite-result and worksheet number-publication rules.For the ending-payment example, base is 1.25, g is 1.5625, difference 0.5625 and term 2.25. The two stored components are minus 1562.5 and minus 225, giving positive 1787.5 after negation. Beginning timing multiplies term by 1.25 to obtain 2.8125.
A boundary reconstruction is r=2^-53,n=1,pmt=-1,pv=0,type=0: the stored base and growth are one, difference is zero and the reconstructed result is zero. At exactly r=0 the linear term is one instead. The cited test source retains this cancellation control; a stable expm1(n*log1p(r))/r implementation would have a different result. Do not smooth away the measured branch merely because the mathematical one-period value is one.
The source retains separate unit controls for the growth, annuity quotient, timing product, two balance products and final addition. Those constrain stages independently of their producers. Complete POWER behaviour, other input routes and environments, and remaining reported FV mismatches still need their own evidence; the stage recipe is not a whole-function equality claim.
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.
FV · 4 lines · calc-func/src/catalogue/financial.rs on GitHub2 fv_fn "FV" (3, 5) [V "rate", V "nper", V "pmt", V "pv", V "type"] |s, a, sv| {
let t = timing(s, a, 4)?;
tv_out(s, tv::fv(num(s, a, 0)?, num(s, a, 1)?, num(s, a, 2)?, opt(s, a, 3, 0.0)?, t))
}
fv · 32 lines · calc-func/src/ported/financial_time_value_family.rs on GitHubpub fn fv(
periodic_rate: f64,
periods: f64,
payment_value: f64,
present_value: f64,
timing: PaymentTiming,
) -> Result<f64, FinancialError> {
validate_finite(&[periodic_rate, periods, payment_value, present_value])?;
// R31 n=1 public growth calls expose the base store. Independent POWER
// leaves confirm the same input stage at the remaining multi-period cases.
let factor = growth_from_base(excel_x87_add(1.0, periodic_rate), periods)?;
// R31 paired end/beginning unit calls identify division before timing,
// with each operation stored from PC64. Small-rate controls keep only
// exact zero on the linear route, including measured cancellation at 2^-53.
// Reuse FV's growth stage; PV retains its own composition above.
let term = if periodic_rate == 0.0 {
periods
} else {
let end_term = excel_x87_div(factor - 1.0, periodic_rate);
excel_x87_mul(end_term, timing.factor(periodic_rate))
};
// R31 public unit calls isolate both products from their growth and annuity
// helpers. Separate nonzero pairs and addition ties identify the final store.
let present_component = excel_x87_mul(present_value, factor);
let payment_component = excel_x87_mul(payment_value, term);
let result = -excel_x87_add(present_component, payment_component);
if result.is_finite() {
Ok(result)
} else {
Err(FinancialError::Num)
}
}
tv_out catalogue/financialtiming catalogue/financialbackend::sqrt ported/excel_numericbinary_with ported/excel_numericexcel_pow_positive ported/excel_numericexcel_pow_chain ported/excel_numericexcel_x87_add ported/excel_numericexcel_x87_mul ported/excel_numericexcel_x87_div ported/excel_numericexcel_x87_recip ported/excel_numericmul ported/excel_numeric/x87add ported/excel_numeric/x87div ported/excel_numeric/x87recip ported/excel_numeric/x87pow2_positive ported/excel_numeric/x87_chainspow2 ported/excel_numeric/x87_chainsexp_ext ported/excel_numeric/x87_chainsexp_with ported/excel_numeric/x87_chainsexcel_exp ported/excel_numeric/x87_chainslog_with ported/excel_numeric/x87_chainsexcel_log ported/excel_numeric/x87_chainsPaymentTiming::factor ported/financial_time_value_familyvalidate_finite ported/financial_time_value_familygrowth ported/financial_time_value_familyannuity_term ported/financial_time_value_familygrowth_from_base ported/financial_time_value_familybalance_equation ported/financial_time_value_familyvalues_bracket_root ported/financial_time_value_familybisect_rate_bracket ported/financial_time_value_familysearch_rate_bracket_from_zero ported/financial_time_value_familyrate ported/financial_time_value_familypolish_root ported/financial_time_value_familyrate_root ported/financial_time_value_familyexact_integer_magnitude ported/power_fnaccept_negative_base_odd_root ported/power_fnbinexp_positive ported/power_fnpower_kernel ported/power_fnNo 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 |
|---|---|---|
| 20131 | Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics | 789 |
| 20228 | Windows, 64-bit, CPU not recorded | 512 |
| 20430 | Windows, 64-bit, CPU not recorded | 1,230 |
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, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics
789 captured inputs are indexed for this environment. Capture dates: 2026-07-11 to 2026-07-23. This is a reading count, not a comparison with another build.
Windows, 64-bit, CPU not recorded
512 captured inputs are indexed for this environment. Capture dates: 2026-08-09 to 2026-08-09. This is a reading count, not a comparison with another build.
Windows, 64-bit, CPU not recorded
1,230 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.
PV, PMT, NPER and RATE solve other variables of the annuity equation. FVSCHEDULE applies varying rates to a principal without this payment stream; NPV discounts varying equally spaced payments.
No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents