14

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.");
}
Jason Chen
  • 312
  • 1
  • 4
  • 12

3 Answers3

18

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.

Óscar López
  • 232,561
  • 37
  • 312
  • 386
  • 1
    `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 high `level`s (if you'd use `long` or even a bignum type instead of `int`). –  Apr 27 '14 at 18:03
  • @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. – DaoWen Apr 27 '14 at 18:04
4

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);
DaoWen
  • 32,589
  • 6
  • 74
  • 101
  • Just `5<<(level-1)` will do too. I doubt javac is clever enough to make that optimization by itself. –  Apr 27 '14 at 18:05
0

Math.pow return double and you assigning double value to int this is why it is giving error. You have to downcast it. Like

int levelMeal = (int)5*(Math.pow(2,level-1));
keyser
  • 18,829
  • 16
  • 59
  • 101
niiraj874u
  • 2,180
  • 1
  • 12
  • 19