C中的整数转换为double,产生零值

chi*_*der 0 c math casting

我最初有一个使用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)));

}
Run Code Online (Sandbox Code Playgroud)

如果我在任何整数值(例如8)上调用foo ,则第二个printf语句每次都打印为零.(当然,第三个也是如此).不应该将double转换为int直接吗?

Mat*_*lia 8

你有几件事情错了.

首先,你正在使用说明%dprintf,但你传递给它一个double值; 对于doubles,你应该使用%f1,否则printf会尝试将字节解释double为a int,导致意外结果(在你的情况下为0).

请注意,最近的编译器通常会注意到这种错误,警告级别足够高.

而且,在你写的return语句中

1/2 *( pow( (double) n, 2))
Run Code Online (Sandbox Code Playgroud)

由于该1/2因子,该表达式将始终为零.两个12intS,因此执行整数除法,显然它导致0,杀死整个表达式.

解决方案:将1/2to 更改为1/2.(其中2.表示2作为double值,将操作提升为浮点除法),或者简单地将其替换为0.5,或者(甚至更简单)在表达式的末尾执行除法.


  1. 琐事:我总是怀疑%f是为了float什么,还有其他东西用于doubles; 相反,事实证明floats 没有说明符,因为它们在double作为"变量参数"传递给函数时自动转换为s(所以这适用于printf).