pow 的问题给我一个无限的答案

Problem with pow giving me an infinite answer

我正在尝试计算给定费率和每年付款次数的折扣系数。

#include <iostream>
using namespace std;
int main()
{
    uint32_t due_dates_per_year = 2;
    double t = 1;
    double rate = 0.05;
    double df = pow(1 + rate / due_dates_per_year, -due_dates_per_year * t);
    cout << df;
    return 0;
}

输出是"inf"但应该比1小一点。

有人知道这是怎么回事吗?

问题出在std::pow的指数(第二个参数)。表达式

-due_dates_per_year * t

grouped as (-due_dates_per_year) * t (这就是 C++ grammar 解析表达式的方式)。 unsigned 类型的一元否定会产生一个大的(以及 unsigned)的数字来解释结果。

除了为 due_dates_per_year 使用 signed 类型外,重新排列

double df = std::pow(1 + rate / due_dates_per_year, -t * due_dates_per_year);

是一个修复。