【问题标题】:Having trouble with pow() in C在 C 中遇到 pow() 问题
【发布时间】:2018-10-23 18:30:50
【问题描述】:

我目前正在阅读 Stephen Kochan 的“C 语言编程(第 3 版)”的在线版本。其中一项活动涉及评估方程式,

编写一个计算以下表达式并显示结果的程序 (记得使用指数格式显示结果): (3.31 x 10-8 x 2.01 x 10-7) / (7.16 x 10-6 + 2.01 x 10-8 )

当我尝试这样做时,输出始终为 0.0000。这是我的代码。

#include <stdio.h>
int main (void) {
float result;
    result = (3.31 * pow(10,-8) * 2.01 * pow(10,-7)) / (7.16 * pow(10,-6) + 2.01 * pow(10, -8));
    printf ("%f", result);
    return 0;
}

如果我做错了什么,请指出。如果您有任何提示,请说出来。

【问题讨论】:

  • 你可能误解了这个问题。 2.01e-7 这样的“科学”符号在 C 语言中是完全合法的。
  • 默认情况下您应该使用double,只有在内存极度受限时才使用float
  • @EugeneSh。嵌入式或移动环境总是有其怪癖。这不会改变通常double 是一个很好的默认值并且pow 返回double 的事实。
  • 应该比这更简单:#include &lt;stdio.h&gt; int main(void) { printf("%.16g\n", 3.31e-8 * 2.01e-7 / (7.16e-6 + 2.01e-8)); } 应该输出9.266026935558e-10

标签: c exponent


【解决方案1】:

你必须#include &lt;math.h&gt;

另外,改成这样:

printf ("%e\n", result);

你应该也有

double result;

因为pow() 返回一个double

【讨论】:

  • 我没有投票,但这可能是因为这个答案忽略了pow 没有声明。编译器可能给了它一个隐式声明,它返回int。那么真正的pow 的行为是未定义的。而pow 返回double 这一事实并不意味着应该将其结果分配给double。存在真正需要的问题,但正确性不是直接问题。
  • 不知道为什么人们讨厌它,因为它显示了正确的价值。默认的%f 表示法缺乏足够的精度。这里的答案是0.000000000926602693555799825448
  • @EricPostpischil 谢谢。我确实有那个警告,但是那个编译器是依赖的​​吗?
  • Diwnvoter 在这里。这个答案部分正确(需要 e 格式),部分无用(切换到 double 是无害的,但不需要解决问题)并且缺少一个非常(最?)重要的部分(使用pow,必须@987654335 @。该程序可能仍然可以在没有最后一部分的情况下与某些编译器一起使用,尽管这是非标准的并且不能以任何方式保证。所以是的,可能投票太快了。
  • 这个答案实际上缺少的是,根本没有理由对这个问题使用pow
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多