2013-04-11 2 views
8

Я пытаюсь вычислить a^(1/n), где ^ обозначает возведение в степень.Как рассчитать a^(1/n)?

Однако следующее:

Math.pow(8, 1/3) 

возвращается 1.0 вместо возвращения 2.0.

Почему?

+9

ЗВС. Прелестный. :) – 2013-04-11 18:01:42

+10

Хотя этот вопрос мог бы использовать лучшее описание, я действительно не понимаю все нисходящие потоки. Это может быть тривиально для большинства людей здесь, но такая вещь (целочисленное деление, когда требуется разделение по платам) - очень распространенная проблема, особенно среди новых разработчиков; этот вопрос определенно поможет другим. – Saggio

+1

@ Saggio - Да, это главный камень преткновения для новичков, и даже некоторые из нас «эксперты» время от времени сталкиваются с этим (и тратят больше времени на проблему, чем мы хотим признать, прежде чем мы это выясним). –

ответ

17

Проблема заключается в том, что 1/3 использует integer (truncating) division, результат которого равен нулю. Изменение кода

Math.pow(8, 1./3); 

(The . превращает 1. в плавающей точкой буквальным.)

+0

Большое вам спасибо. Это кажется тривиальным, но важным для меня. – GltknBtn

+0

@GltknBtn: Добро пожаловать. В этот момент все сталкиваются с этим. Это еще менее очевидно, когда деление является частью более сложного выражения, как это имеет место здесь. – NPE

4

Попробуйте Math.pow(8, (1.0f/3.0f)) вместо этого.

1/3 сделает целое подразделение, которое даст вам 8^0 = 1

+3

Что, нет объяснений? –

+0

Это интуитивно очевидно для ранга неофита! –

+2

@HotLicks: Если бы так, этот вопрос не существовал бы. –

5

1/3 становится 0 (Потому что 1 и 3 воспринимаются как int литералов).

Таким образом, вы должны сделать эти литералы плавать/двойной ...

Do:

Math.pow(8, 1f/3) или

Math.pow(8, 1./3) или

Math.pow(8, 1.0/3)

Смежные вопросы