Why Does Math.pow(x,y) Count as a Double?
Solution 1
You'll have to do this:
int levelMeal = (int) (5*(Math.pow(2,level-1)));
^
this is a cast
As you can see in the documentation, Math.pow()
returns a double
by design, but if you need an int
then an explicit cast must be performed.
Solution 2
I think there's typically hardware support on most modern processors for doing floating-point powers, but not integers. Because of that, for a general power, it's actually faster to do Math.power
with a double
and then convert it back to an int
.
However, in this case there's a faster way to do it for ints. Since you're doing a power of 2, you can just use the bitwise left-shift operator instead:
int levelMeal = 5*(1<<(level-1));
As Rhymoid pointed out in his comment, that expression can be further simplified to remove the 1
:
int levelMeal = 5<<(level-1);
Jason Chen
I'm currently a freshman at Harvey Mudd College looking to major in computer science and math. I like playing piano and ping pong in my free time.
Updated on July 09, 2022Comments
-
Jason Chen almost 2 years
I'm writing a Java program to calculate how much food it will take to get a monster to a certain level in My Singing Monsters. When I run the program, it says, "cannot convert from double to int". Can someone explain why this is? Here's the program.
int totalFood = 0; int level = 1; int levelMeal = 5*(Math.pow(2,level-1)); int mealNumber = 1; int levelGoal = 1; while(level != levelGoal) { if(mealNumber != 5) { mealNumber += 1; totalFood += levelMeal; } else if(mealNumber == 5) { mealNumber = 0; level += 1; } } if(level == levelGoal) { println("The total amount of food required for a monster to reach level " + levelGoal + " is " + totalFood + " food."); }
-
Admin about 10 years
5<<(level-1)
would be a more appropriate implementation (if you fix the same overflow problems you get from going through double), and will be more precise for very highlevel
s (if you'd uselong
or even a bignum type instead ofint
). -
John Powell about 10 yearsThanks, I didn't know that.
-
DaoWen about 10 years@Rhymoid - That's what I put in my answer. However, I overlooked the fact that I could just directly shift the 5 instead of doing a multiply afterwards. I'll update my answer.
-
Admin about 10 yearsJust
5<<(level-1)
will do too. I doubt javac is clever enough to make that optimization by itself.