Как я могу заставить оболочку bean работать как математический парсер? - PullRequest
0 голосов
/ 05 декабря 2011

Я использую интерпретатор Bean Shell в цикле for, как этот

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

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

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

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

0 голосов
/ 05 декабря 2011

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

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

И используя Math.pow(a, b) в качестве ввода.

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

...