Why Does Math.pow(x,y) Count as a Double?

34,098

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);
Share:
34,098
Jason Chen
Author by

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, 2022

Comments

  • Jason Chen
    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
    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 high levels (if you'd use long or even a bignum type instead of int).
  • John Powell
    John Powell about 10 years
    Thanks, I didn't know that.
  • DaoWen
    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
    Admin about 10 years
    Just 5<<(level-1) will do too. I doubt javac is clever enough to make that optimization by itself.