我尝试解决数学问题,但是我的输出灵敏度有一些差异,例如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`
这些功能之间有什么区别?
答案 0 :(得分:5)
pow
在double
上运行。 powf
在float
上运行。这是C语言中的一种相当标准的表示法,其中函数的基本名称将用于默认类型(例如int
和double
)的操作数(和返回值),而前缀和后缀是用于其他类型(例如long
,float
等)。这里是参考: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所述,pow
取double
,其中powf
取float
使精度降低很多。
答案 4 :(得分:0)
powf
返回并接受float
的参数。
pow
返回double并接受double
的参数。如果将浮点数作为参数给出,则按照常规促销规则将其转换为double
。See here
您在结果中看到的差异是由于double