Постфиксная оценка С++ с десятичными точками

У меня реализован алгоритм сортировочной станции (используя код из Википедии, модифицированный для использования стеков/очередей stl), но теперь мне интересно, как он будет оценивать десятичные дроби, которые я получаю от деления. Приложение javascript на scriptasylum.com (не могу связать) работает нормально и дает ожидаемый результат:

Infix: 1/6*((1/4)/(1/2)+1/2)
Postfix: 16/14/12//12/+*
Eval: 0.16666666666666666 (1/6)

Infix: 0.5+1
Postfix: 0.51+
Eval: 1.5

Я нашел здесь один пример оценки постфикса, но он не был закончен и не учитывал десятичные точки.

Вот мой текущий код: http://codepad.org/zDXnOELK


person s00pcan    schedule 17.11.2010    source источник
comment
Работает нормально? Не даст ли тогда 0.1667?   -  person MSalters    schedule 17.11.2010
comment
Это было мое округление, а не приложение. Его значение было 0,16666666666666666.   -  person s00pcan    schedule 18.11.2010


Ответы (1)


Самое простое (что и делает реализация Javascript, благодаря семантике языка) — представить все числа внутренне как double.

Если вы хотите сделать что-то умнее, я должен предупредить вас, что это намного больше кода и намного более трудных дизайнерских решений, и я рекомендую вам начать с чтения Схема числовой башни.

person zwol    schedule 17.11.2010
comment
Как это говорит о разнице между 10,51 + 0,5 и 10,5 + 10,5? Оба оцениваются в 10.510.5+ - person s00pcan; 18.11.2010
comment
Вы должны испускать пробел после каждого токена, иначе да, это неоднозначно. (Другими словами, оцените 10.51+0.5 в 10.51 0.5 + и 10.5+10.5 в 10.5 10.5 +.) Кроме того, я не могу найти то, с чем вы сравниваете, но это может быть непосредственная оценка дерева синтаксического анализа, а не сначала сериализация в постфикс. - person zwol; 18.11.2010
comment
s00pcan: Ваша проблема не имеет ничего общего с десятичными знаками, а связана с наличием более одной цифры в операнде. - person Ben Voigt; 18.11.2010
comment
Я понимаю это. Что я могу с этим поделать? Должен ли я переключить этот стек, чтобы использовать строки или двойные числа вместо одиночных символов, затем читать до следующего оператора, а затем помещать его в стек? - person s00pcan; 18.11.2010
comment
Да, это звучит примерно так. (Оператор или пробел.) strtod — ваш друг. - person zwol; 18.11.2010
comment
Изменен код для использования стека строк. Пока не уверен, что это то, чего я хочу. Но это облегчает наличие операторов с числами. инфикс: 1.0/60 постфикс: 1.0 60 / - person s00pcan; 18.11.2010
comment
В конечном итоге вам может понадобиться stack<Term>, где Term — это класс, который может представлять либо код оператора, либо операнд. - person zwol; 18.11.2010
comment
Прямо сейчас я в основном работаю с операторами над одной цифрой и с десятичными точками. Скобки сбивают с толку, но я собираюсь поработать над этим еще немного. - person s00pcan; 18.11.2010