2011-12-04 1 views
0

Я использую переводчика Bean Shell в цикле, как этотКак я могу использовать оболочку гусиной оболочки в качестве математического анализатора?

for(int i = 0; i <functionSize; i++){ 
     interpreter.set("x", i); 
     yvalues[i] = (Integer) interpreter.eval(functionString); 
    } 

Проблема, которую я имею что когда я функция 2^х Я получаю очень странный вывод. Список первых нескольких значений y выглядит следующим образом: 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9 ...

Кто-нибудь знает, как получить компонент интерпретатор оболочки для правильной оценки полномочий?

Редактировать: Я хотел бы использовать интерпретатор оболочки bean вместо написания математического анализатора. Кто-нибудь знает, как я могу получить оболочку компонента для оценки полномочий функций x?

ответ

4

Выражение 2^x представляет побитовое XOR, а не возведение в степень. Используйте, пожалуйста, Math.pow(2,x), но понимайте, что он работает в дупле, а не в ints, поэтому даст вам ответ с плавающей запятой, который, вероятно, вызовет исключение, когда вы попытаетесь применить результат как целое.

Редактировать: есть также BigInteger.pow(), который возвращает BigInteger.

Или, если вы хотите полномочия 2, но не какой-либо другой базы, используйте выражение для сдвига влево: 1 << x для х между 0 и 31.

+0

Невозможно ли получить оболочку для проверки силы? Это было бы самым удобным и упростило бы код. У меня не было бы отдельного дела для синтаксического анализа. – wbarksdale

+0

Um, BeanShell - это Java. Java - это то, что есть. Если вы хотите предоставить функцию (некоторый класс с помощью метода) самостоятельно и назначить ее переменной, которую вы выставите BeanShell, это зависит от вас. –

+0

Но нет * оператора *, представляющего возведение в степень в Java. –

0

Законченное редактирования для:

double y = Double.parseDouble(interpreter.eval(functionString).toString()); 
yvalues[i] = (int) y; 

И используя Math.pow(a, b) как мой вход.

Не выглядит красиво, но его работа.