c - 在 C 中将整数转换为 double 会产生零值

标签 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 的转换不应该很简单吗?

最佳答案

你有几处地方错了。

首先,您在 printf 中使用了 %d 说明符,但是您向它传递了一个 double 值;对于 double,你应该使用 %f1,否则 printf 将尝试解释double 作为 int,导致意外结果(在您的情况下为 0)。

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

另外,在你写的return语句中

1/2 *( pow( (double) n, 2))

由于 1/2 因素,此表达式将始终产生零。 12 都是 int,因此执行整数除法,显然结果为 0,这会杀死整个表达式。

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


  1. 琐事:我一直怀疑 %f 是用于 float,而 double 使用的是其他东西;相反,事实证明 float 没有说明符,因为当它们作为“可变参数”传递给函数时会自动转换为 double(因此这适用于printf).

关于c - 在 C 中将整数转换为 double 会产生零值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5531064/

上一篇:c - 进程的堆栈布局

下一篇:C 结构节点

相关文章:

c - 我不明白这个 C 代码的行为(与 2 个位域结构、一个字和一个字节数组的 union )

c - 尝试映射大页面 (1GB) 时 mmap 失败

java - 为什么整数的java除法比黑客的喜悦实现更快

c - 修改C中的时间函数

c# - "Prefix"和 "as"转换

c - 参加事件时 sleep

c - 需要帮助理解这段代码

c# - 如何通过给定的点集合确定形状是半圆?

c++ - 四舍五入一个整数,使其乘以一个 float 返回一个整数

linq - C# : Chained Linq methods and casting