Recently i write a block of code:
const int sections = 10;
for(int t= 0; t < 5; t++){
int i = pow(sections, 5- t -1);
cout << i << en
If the code in your first example is the exact code you're running, then you have a buggy library. Regardless of whether you're picking up std::pow
or C's pow
which takes doubles, even if the double version is chosen, 10 is exactly representable as a double
. As such the exponentiation is exactly representable as a double
. No rounding or truncation or anything like that should occur.
With g++ 4.5 I couldn't reproduce your (strange) behavior even using -ffast-math
and -O3
.
Now what I suspect is happening is that sections
is not being assigned the literal 10 directly but instead is being read or computed internally such that its value is something like 9.9999999999999
, which when raised to the fourth power generates a number like 9999.9999999
. This is then truncated to the integer 9999 which is displayed.
Depending on your needs you may want to round either the source number or the final number prior to assignment into an int. For example: int i = pow(sections, 5- t -1) + 0.5; // Add 0.5 and truncate to round to nearest.