#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n,i,ele;
n=5;
ele=pow(n,2);
printf("%d",ele);
return 0;
}
The output is 24
.
I'm using GNU/GCC in Code::Blocks.
What is happening?
I know the pow
function returns a double
, but 25
fits an int type so why does this code print a 24
instead of a 25
? If n=4; n=6; n=3; n=2;
the code works, but with the five it doesn't.
When you use pow with variables, its result is
double
. Assigning to anint
truncates it.So you can avoid this error by assigning result of
pow
todouble
orfloat
variable.So basically
It translates to
exp(log(x) * y)
which will produce a result that isn't precisely the same asx^y
- just a near approximation as a floating point value,. So for example5^2
will become24.9999996
or25.00002
If you do not
#include <math.h>
then the compiler does not know the types of the arguments topow()
which are bothdouble
notint
-- so you get an undefined result. You get 24, I get 16418.Here is what may be happening here. You should be able to confirm this by looking at your compiler's implementation of the
pow
function:Assuming you have the correct #include's, (all the previous answers and comments about this are correct -- don't take the
#include
files for granted), the prototype for the standardpow
function is this:double pow(double, double);
and you're calling
pow
like this:pow(5,2);
The
pow
function goes through an algorithm (probably using logarithms), thus uses floating point functions and values to compute the power value.The
pow
function does not go through a naive "multiply the value of x a total of n times", since it has to also computepow
using fractional exponents, and you can't compute fractional powers that way.So more than likely, the computation of
pow
using the parameters 5 and 2 resulted in a slight rounding error. When you assigned to anint
, you truncated the fractional value, thus yielding 24.If you are using integers, you might as well write your own "intpow" or similar function that simply multiplies the value the requisite number of times. The benefits of this are:
You won't get into the situation where you may get subtle rounding errors using
pow
.Your
intpow
function will more than likely run faster than an equivalent call topow
.You want int result from a function meant for doubles.
You should perhaps use
Floating-point arithmetic is not exact.
Although small values can be added and subtracted exactly, the
pow()
function normally works by multiplying logarithms, so even if the inputs are both exact, the result is not. Assigning toint
always truncates, so if the inexactness is negative, you'll get 24 rather than 25.The moral of this story is to use integer operations on integers, and be suspicious of
<math.h>
functions when the actual arguments are to be promoted or truncated. It's unfortunate that GCC doesn't warn unless you add-Wfloat-conversion
(it's not in-Wall -Wextra
, probably because there are many cases where such conversion is anticipated and wanted).For integer powers, it's always safer and faster to use multiplication (division if negative) rather than
pow()
- reserve the latter for where it's needed! Do be aware of the risk of overflow, though.