每当我在这个程序中输入一个数字时,程序返回的值比实际结果小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); }
nxagd54h1#
pow()返回一个double,则从double到int的隐式转换是"向零舍入"。因此它取决于pow()函数的行为。如果它是完美的,那么没有问题,转换是精确的。如果没有:1)结果稍大,则转换将其向下舍入到期望值。2)如果结果稍小,则转换将向下舍入,这就是您所看到的。
pow()
double
int
使用rounding functions将转换更改为"舍入到最接近的整数
c=lround(pow((5),(n)));
在这种情况下,只要pow()的误差小于+-0.5,就可以得到预期的结果。
kzipqqlq2#
pow()接受double参数并返回double。如果将返回值存储到int中并将其打印出来,则可能得不到所需的结果。
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; }
bqjvbblv4#
当命令printf func时,你可以使用%f格式说明符。你应该可以准确地看到你的结果。在%d格式说明符中,值趋向于最终结果,例如5^2= 24.999999999,因此显示的结果是24。
4条答案
按热度按时间nxagd54h1#
pow()
返回一个double
,则从double
到int
的隐式转换是"向零舍入"。因此它取决于
pow()
函数的行为。如果它是完美的,那么没有问题,转换是精确的。
如果没有:
1)结果稍大,则转换将其向下舍入到期望值。
2)如果结果稍小,则转换将向下舍入,这就是您所看到的。
使用rounding functions将转换更改为"舍入到最接近的整数
在这种情况下,只要
pow()
的误差小于+-0.5,就可以得到预期的结果。kzipqqlq2#
pow()
接受double
参数并返回double
。如果将返回值存储到
int
中并将其打印出来,则可能得不到所需的结果。lsmd5eda3#
如果您需要对大数字进行精确计算,您应该使用GMP这样的任意精度数学库。
bqjvbblv4#
当命令printf func时,你可以使用%f格式说明符。你应该可以准确地看到你的结果。在%d格式说明符中,值趋向于最终结果,例如5^2= 24.999999999,因此显示的结果是24。