我最初有一个使用pow()的函数,我注意到它每次都返回零值。在调试时,我发现这似乎是问题的根源:
#include <math.h>
#include <stdio.h>
#include <string.h>
int foo(int n)
{
printf("%d is number passed in \n", n);
double base = (double) n;
printf("%d is base \n", base);
printf("%d is power\n", pow(base ,2));
return (1/2 *( pow( (double) n, 2)));
}
如果我在任何整数值(例如8)上调用foo,则第二个printf语句每次都打印为零。 (当然,第三个也是如此)。不应该将double转换为int直接吗?
答案 0 :(得分:8)
你有几件事情错了。
首先,您使用%d
中的printf
说明符,但是您传递的值为double
;对于double
s,您应该使用%f
1 ,否则printf
会尝试将double
的字节解释为{{1}导致意外结果(在你的情况下为0)。
请注意,这种错误通常会被警告级别足够高的最新编译器注意到。
此外,在你写的return语句中
int
由于1/2 *( pow( (double) n, 2))
因子,此表达式将始终为零。 1/2
和1
都是2
s,因此会执行整数除法,显然会导致0,这会导致整个表达式失效。
解决方案:将int
更改为1/2
(其中1/2.
表示2为2.
值,这会将操作提升为浮点除法),或者只是用double
替换它,或者(甚至更简单)在表达式的末尾执行除法。
0.5
是%f
,还有其他一些用于float
s;相反,事实证明double
没有说明符,因为它们在作为“变量参数”传递给函数时会自动转换为float
(因此这适用于double
) 答案 1 :(得分:0)
答案 2 :(得分:0)
printf("%g is base \n", base);
printf("%g is power\n", pow(base ,2));
你的第二个问题是你这样做:
return (1/2 *( pow( (double) n, 2)));
但已定义您的函数以返回int
。您需要将其定义为返回double
,而不是在那里使用整数数学:)
答案 3 :(得分:0)
通过printf在c中输出一个double,你应该使用%g或%lf(lf代表“long float”这是一个double,实际上float代表单精度:D) %g截断到最低有效数字,%lf不截断。 你甚至可以使用类似的东西 %。20g,所以你要求在点(或逗号)之后用20位十进制数字写数字。
如果要从函数中获取浮点结果,请将函数声明更改为
double foo(int n)
我建议将返回行更改为此
return (0.5 * pow( (double) n, 2)));
0.5是以浮点写入1/2的正确方法。
但是如果你只想要一个整数,那么你应该这样做:
return ((int)pow( (double) n, 2)/2);
事实上,pow返回一个double,你应该将它转换为整数
希望这是有用的:)