我试图解决一个数学问题,我的输出灵敏度有点不同,如0.07。然后我比较代码中的pow()powf(),我发现了这种敏感性。代码如下:

int main()
{

    int terms, sign=-1;
    double x, operation=0.0;

    printf("Please enter the number of terms : ");
    scanf_s("%d", &terms);

    while (terms <= 0)
    {
        printf("Please re-enter the number of terms :");
        scanf_s("%d", &terms);
    }

    printf("Please enter a value for x :");
    scanf_s("%lf", &x);

    for (int i = 1; i <= terms; i++)
    {
    sign = sign * (-1);
    operation = operation + sign * powf(x + i / 10.0, (2 * i) - 1) / (2 * i);
    }
    printf("The result is : %.2lf\n", operation);

    system("pause");
    return 0;

}

样品:
terms  : 10

x : 1.1

output  : `-59783.61` with `powf`

output  : `-59783.67` with `pow`

这些功能之间有什么区别?

最佳答案

powdoubles上操作。powffloats上操作。这是C中相当标准的表示法,其中函数的基名称将用于默认类型(如intdouble)的操作数(和返回值),而带前缀和后缀的版本用于其他类型(如longfloat等)。这里有一个参考:http://pubs.opengroup.org/onlinepubs/9699919799/
数据类型的这种差异完全解释了您在结果中看到的差异。
doubles在尾数中包含53位精度,它转换为~16位小数精度。这超出了显示结果的精度,因此可能足够精确。
另一方面,s的尾数只有24位,可以转换为~7位小数。任何操作的组合都会导致舍入误差几乎立即蔓延到显示精度之内。

09-09 18:21