#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. Похоже, сейчас самое подходящее время научиться пользоваться отладчиком — пошагово изучить программу и посмотреть переменные.