代码块电源function在c中不起作用
我正在使用代码块来学习c。 我的代码是
#include #include int main() { int x; x = pow(5,2); printf("%d", x); } Output is 25
当我使用此代码时
#include #include int main() { int x,i,j; printf("please enter first value"); scanf("%d", &i);//5 printf("please enter second value");//2 scanf("%d", &j); x = pow(i,j); printf("%d", x); } Output is 24
这有什么不对? 我只是使用扫描function,并以同样的方式使用powfunction。
我怀疑你的libm
有一个天真的pow
实现(我得到25,应该是)。 如果计算pow(x,y)
为exp(y*log(x))
为正x
而不检查(小)积分指数并专门处理它们,你会得到
Prelude> 2 * log 5 3.2188758248682006 Prelude> exp it 24.999999999999996
一个略小于25的double
结果,所以当它转换为int
会被截断为24。
要检查,请将pow(i,j)
的结果分配给double
并打印出来。
使用硬编码的pow(5,2)
,编译器(很可能,即使没有优化也是gcc所做的)在编译过程中精确计算结果。
尝试将初始化更改为:
int x=-1 ,i=-1 ,j=-1;
最后打印到这个:
printf("pow(%d, %d) == %d\n", i, j, x);
这应该对这个问题有很好的暗示。 另外,检查scanf
返回值,它们应该返回读取的项目数,即。 1,上面的代码。
几乎可以肯定的是,你为scanf输入了无效输入,并且i
或j
保持未初始化,而24只是垃圾值。
此外,编译并启用警告,并修复它们(例如,添加return 0;
到main
结尾)。
你的代码正确地在我的Windows x64上提供25。
您可能需要再次运行它,看看您是否只是读错了…
缺少“返回0;” 这不是问题。
如果,任何事情都可能出错,
你可以尝试添加
fflush(stdin);//or out
在scanf和printf之后。 如果任何冲洗解决了您的问题,您就会知道出了什么问题。
似乎第二个程序没有任何问题,除了你必须在最后添加
return 0;
如果你用2读取值j,那么结果将只有25。
使用你的代码我得到了结果25,这是正确的。 虽然尝试更改结果的数据类型,如float或double。