реализация функции cmath с помощью RPN calculator

#c

#c

Вопрос:

У меня возникла проблема с реализацией функций cmath в RPN calc. Я замечаю различное поведение моих вызовов. Если у меня есть pow(y, x) в инструкции POW, я получаю 0,5 в качестве ответа из выражения: 2 1 arctan cos pow (правильно).. Но затем, используя тот же код, если я ввожу: 3 recip 8 pow, я получаю 0 (неверно) ..

Однако, если я переключу y и x в вызове pow() (pow(x, y)) и введу: 2 1 arctan cos pow, я получу 0,9 (неверно), а если я введу: 3 recip 8 pow, я получу 2 (правильно) ..

Я пробовал atan(stack.peek()); , но это возвращает 0 с pow(y,x) и 1 с pow(x,y);

Моя логика, должно быть, где-то ошибочна, я просто не уверен.. Спасибо

stack.cpp

 int main(int argc, char *argv[]){
    HPStack stack;
    string line;

    while(getline(cin,line)) {
        stringstream ss(line);
        string token;
        while(ss >> token){
            if(isdigit(token[0])){
                stack.push(atof(token.data()));
            } else if (token == " "){
                double x = stack.pop();
                double y = stack.pop();
                stack.push(y x);
            } else if (token == "-"){
                double x = stack.pop();
                double y = stack.pop();
                stack.push(y-x);
            } else if (token == "/"){
                double x = stack.pop();
                double y = stack.pop();
                stack.push(y/x);
            } else if (token == "*"){
                double x = stack.pop();
                double y = stack.pop();
                stack.push(y*x);
            } else if (token == "COS"){
                stack.push(cos(stack.peek()));
            } else if (token == "ARCTAN"){
                double x = stack.pop();
                double y = stack.pop();
                stack.push(atan2(x,y));
            else if (token == "RECIP"){
                double x = stack.peek();
                double y = stack.peek();
                double recip = 1/y;
                stack.push(recip);
            } else if (token == "POW"){
                double x = stack.pop();
                double y = stack.pop();
                double sum = pow(y,x);
                double answer = (int)(sum*10.0)/10.0;
                stack.push(answer);
            } 
        }
        cout << stack.peek() << endl;
    }
    return 0;
}
  

HPStack.h

 #ifndef HPSTACK_H_
#define HPSTACK_H_

class HPStack {
    public:
        void push(double value);
        double pop();
        double peek();
    private:
        double x=0.0,y=0.0,z=0.0,t=0.0;
};

#endif
  

HPStack.cpp

 #include "HPStack.h"

void HPStack::push(double value){
    t = z;
    z = y;
    y = x;
    x = value;
}

double HPStack::pop(){
    double out; 
    out = x;
    x = y;
    y = z;
    z = t;
    return out;
}

double HPStack::peek(){
    return x;
}
  

Комментарии:

1. Ваши реализации cos и recip выглядят неправильно. И зачем ограничивать ваш стек 4 элементами? C имеет стандартный класс стека…

2. Также подумайте о том, что произойдет, если вы попытаетесь извлечь файл из пустого стека.

3. Похоже, сейчас самое подходящее время научиться пользоваться отладчиком — пошагово изучить программу и посмотреть переменные.