C语言 幂函数返回的结果少1

dced5bon  于 2023-01-16  发布在  其他
关注(0)|答案(4)|浏览(252)

每当我在这个程序中输入一个数字时,程序返回的值比实际结果小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);

 }

nxagd54h

nxagd54h1#

pow()返回一个double,则从doubleint的隐式转换是"向零舍入"。
因此它取决于pow()函数的行为。
如果它是完美的,那么没有问题,转换是精确的。
如果没有:
1)结果稍大,则转换将其向下舍入到期望值。
2)如果结果稍小,则转换将向下舍入,这就是您所看到的。

    • 解决方案:**

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

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

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

kzipqqlq

kzipqqlq2#

pow()接受double参数并返回double
如果将返回值存储到int中并将其打印出来,则可能得不到所需的结果。

lsmd5eda

lsmd5eda3#

如果您需要对大数字进行精确计算,您应该使用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;
}
bqjvbblv

bqjvbblv4#

当命令printf func时,你可以使用%f格式说明符。你应该可以准确地看到你的结果。在%d格式说明符中,值趋向于最终结果,例如5^2= 24.999999999,因此显示的结果是24。

相关问题