【问题标题】:Does pow() work for int data type in C? [duplicate]pow() 是否适用于 C 中的 int 数据类型? [复制]
【发布时间】:2015-06-29 12:08:09
【问题描述】:

我只是在编写一个程序来计算整数的幂。但是输出并不像预期的那样。它适用于除 5 的幂之外的所有整数。

我的代码是:

#include <stdio.h>
#include <math.h>

int main(void)
{
  int a,b;
  printf("Enter the number.");
  scanf("\n%d",&a);
  b=pow(a,2);
  printf("\n%d",b);
}

输出是这样的:

"Enter the number. 2
 4
"Enter the number. 5
 24
"Enter the number. 4
 16
"Enter the number. 10
 99

我们不能将pow() 函数用于int 数据类型吗??

【问题讨论】:

  • Cannot reproduce。另外,它是int main(),而不是void main()
  • @AndyG;没有必要获得与 OP 在他的机器上获得的结果相同的结果。问题很好。赞成反对反对票。
  • 我很难理解所有反对票的原因。简单的问题,但我很难过。
  • 为什么该死的人在不给某人证明或修改答案的机会的情况下投反对票?遵守规则 PPPL !!!!!!
  • @GRC - 如果答案错误,它会被否决。这是完全合理的。如果作者修复它,希望可以删除反对票。

标签: c pow exponentiation


【解决方案1】:

C 库函数 double pow(double x, double y)

需要double类型

【讨论】:

  • 这个问题是关于C
  • 取消删除这个帖子!!!
  • 这甚至没有试图解释 OP 的“但输出不如预期”。
【解决方案2】:

没有基于 int 的 pow。您正在遭受的是浮点截断。

基于 int 的 pow 过于受限(输入范围会很快溢出 int)。在许多情况下,基于 int 的 pow,例如在您的情况下,它的 2 的幂可以通过其他方式有效地完成。

【讨论】:

  • 是浮点截断只针对 5 的倍数??
  • 你会在各种数字上击中它。
【解决方案3】:

printf("%a", pow(10, 2)) 看看你得到了什么;我希望你会看到你没有相当得到 100。如果你想要舍入而不是截断,请致电 lround

【讨论】:

    【解决方案4】:

    浮点精度在这里发挥了作用。 pow 的实际工作是使用log

    pow(a, 2) ==> exp(log(a) * 2)
    

    查看math.h 库,上面写着:

    &lt;math.h&gt;

    /* 使用 64 位尾数进行 FPU 数学运算时会出现超精度 使用某些 MSVCRT 数学函数导致意外结果。为了 例如,除非函数返回值被存储(截断为 53 位尾数),以 x 和 y 作为整数值调用 pow 有时会产生非整数结果。 ... */

    只需将0.5 添加到pow 的返回值,然后将其转换为int

    b = (int)(pow(a,2) + 0.5);  
    

    所以,你的问题的答案

    pow() 是否适用于 C 中的 int 数据类型?

    并非总是如此。对于整数求幂,您可以实现自己的函数(这仅适用于 0 和 +ve exp):

    int int_pow(int base, int exp)
    {
        int result = 1;
        while (exp)
        {
            if (exp % 2)
               result *= base;
            exp /= 2;
            base *= base;
        }
        return result;
    }
    

    【讨论】:

    • 您介意扩展“浮点精度正在发挥作用”的含义吗?为什么 pow() 返回错误的值?我希望当将 int 传递给 double 类型的参数时,double 会收到一个精确值 (5 => 5.0000000...)?
    • 那为什么只针对5的倍数???
    • @basanta 我想说这是因为它可能是一个奇数?我无法复制这个问题,所以我只是在这里猜测。
    • @hacks 感谢您在回答 + 文档中的精彩解释。欣赏它
    • @hacks 希望它通过您的审核。尽管仍然存在少量 UB:result *= base;base *= base; 可能 int 溢出。将该检测留到另一天或去unsigned unsigned_pow(unsigned base, unsigned exp)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多