pow和powf有什么区别

时间:2018-10-31 04:14:04

标签: c floating-accuracy

我尝试解决数学问题,但是我的输出灵敏​​度有一些差异,例如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`

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

5 个答案:

答案 0 :(得分:5)

powdouble上运行。 powffloat上运行。这是C语言中的一种相当标准的表示法,其中函数的基本名称将用于默认类型(例如intdouble)的操作数(和返回值),而前缀和后缀是用于其他类型(例如longfloat等)。这里是参考:http://pubs.opengroup.org/onlinepubs/9699919799/

数据类型的这种差异充分说明了您在结果中看到的差异。

double的尾数包含53位精度,这转换为〜16个十进制数字。这超出了显示结果的精度,因此可能足以满足您的目的。

另一方面,

float的尾数只有24位,转换为〜7个十进制数字。任何操作组合都会导致舍入误差几乎立即蔓延到您的显示精度之内。

答案 1 :(得分:2)

C语言直到C11才具有“泛型函数”。相反,标准库中针对不同的数据类型具有不同的功能。

*f的{​​{1}}函数在内部使用单精度的单精度浮点数(<math.h> s上运行。float表示...双精度。始终将非double函数用于双重参数。

答案 2 :(得分:0)

区别是:

Matrix1 <- Matrix1[row.names(Matrix0), ]

说明in here

  

float powf( float base, float exponent ); double pow( double base, double exponent ); 函数计算提升到pow幂的base

答案 3 :(得分:0)

here所述,powdouble,其中powffloat使精度降低很多。

答案 4 :(得分:0)

powf返回并接受float的参数。

pow返回double并接受double的参数。如果将浮点数作为参数给出,则按照常规促销规则将其转换为doubleSee here

您在结果中看到的差异是由于double

的更高精度