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

时间:2011-04-03 17:03:07

标签: 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)));

}

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

4 个答案:

答案 0 :(得分:8)

你有几件事情错了。

首先,您使用%d中的printf说明符,但是您传递的值为double;对于double s,您应该使用%f 1 ,否则printf会尝试将double的字节解释为{{1}导致意外结果(在你的情况下为0)。

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

此外,在你写的return语句中

int

由于1/2 *( pow( (double) n, 2)) 因子,此表达式将始终为零。 1/21都是2 s,因此会执行整数除法,显然会导致0,这会导致整个表达式失效。

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


  1. 琐事:我总是怀疑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,你应该将它转换为整数

希望这是有用的:)