我试图解决一个数学问题,我的输出灵敏度有点不同,如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`
这些功能之间有什么区别?
最佳答案
pow
在double
s上操作。powf
在float
s上操作。这是C中相当标准的表示法,其中函数的基名称将用于默认类型(如int
和double
)的操作数(和返回值),而带前缀和后缀的版本用于其他类型(如long
、float
等)。这里有一个参考:http://pubs.opengroup.org/onlinepubs/9699919799/。
数据类型的这种差异完全解释了您在结果中看到的差异。double
s在尾数中包含53位精度,它转换为~16位小数精度。这超出了显示结果的精度,因此可能足够精确。
另一方面,s的尾数只有24位,可以转换为~7位小数。任何操作的组合都会导致舍入误差几乎立即蔓延到显示精度之内。