【问题标题】:Power function returns 1 less result幂函数返回少 1 个结果
【发布时间】:2016-02-26 17:49:06
【问题描述】:

每当我在这个程序中输入一个数字时,程序都会返回一个比实际结果小 1 的值...这里有什么问题??

#include<stdio.h>
#include<math.h>
 int main(void)
 {
     int a,b,c,n;

     scanf("%d",&n);

     c=pow((5),(n));

    printf("%d",c);

 }

【问题讨论】:

  • 你的意思是,当你输入“2”时,结果是“24”?
  • @user3528438 那是一个'int?
  • @MartinJames 评论的最小长度....
  • 要获得好的答案,最好发布使用的实际值和观察到的输出。

标签: c int double pow


【解决方案1】:

pow() 返回一个double,从doubleint 的隐式转换是“向零舍入”。

所以这取决于pow() 函数的行为。

如果它是完美的,那么没有问题,转换是准确的。

如果没有:

1) 结果稍大,然后转换将它向下舍入到期望值。

2) 如果结果稍小,则转换将向下舍入,这就是您所看到的。

解决方案:

使用rounding functions将转换更改为“舍入到最接近的整数”

c=lround(pow((5),(n)));

在这种情况下,只要pow() 的误差小于+-0.5,就会得到预期的结果。

【讨论】:

    【解决方案2】:

    pow() 接受double 参数并返回double

    如果您将返回值存储到 int 并打印出来,您可能无法得到想要的结果。

    【讨论】:

    • 鉴于 double 的精度预计约为 53 位,而 int 通常只有 32 位,原因不是转换本身,而是 @987654328 中的不准确@算法。
    【解决方案3】:

    如果您需要大数字的准确结果,则应使用 GMP 等任意精度数学库。很简单:

    #include <stdio.h>
    #include <math.h>
    #include <gmp.h>
    
    int main(void) {
        int n;
        mpz_t c;
    
        scanf("%d",&n);
        mpz_ui_pow_ui(c, 5, n);
        gmp_printf("%Zd\n", c);
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 2021-02-12
      • 2010-10-19
      • 1970-01-01
      • 2011-12-27
      • 2012-12-19
      相关资源
      最近更新 更多