我最初有一个使用 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 的转换不应该很简单吗?
最佳答案
你有几处地方错了。
首先,您在 printf
中使用了 %d
说明符,但是您向它传递了一个 double
值;对于 double
,你应该使用 %f
1,否则 printf
将尝试解释double
作为 int
,导致意外结果(在您的情况下为 0)。
请注意,这种错误通常会被警告级别足够高的最新编译器注意到。
另外,在你写的return语句中
1/2 *( pow( (double) n, 2))
由于 1/2
因素,此表达式将始终产生零。 1
和 2
都是 int
,因此执行整数除法,显然结果为 0,这会杀死整个表达式。
解决方案:将 1/2
更改为 1/2.
(其中 2.
将 2 表示为 double
code> 值,将运算提升为浮点除法),或者简单地将其替换为 0.5
,或者(甚至更简单)在表达式末尾执行除以二。
- 琐事:我一直怀疑
%f
是用于float
,而double
使用的是其他东西;相反,事实证明float
没有说明符,因为当它们作为“可变参数”传递给函数时会自动转换为double
(因此这适用于printf
).
关于c - 在 C 中将整数转换为 double 会产生零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5531064/