Почему pow(5,2) становится 24?

Я делаю простой калькулятор, в котором вы можете выбрать функцию, а затем два входа, чтобы получить ответ. Это аккуратная маленькая программа, и все работает гладко, за исключением полномочий. Каждый номер работает правильно.

Но согласно этому: 5^2=24, 5^3=624. Я использую pow(number1,number2).

#include <iostream>
#include<math.h>

using namespace std;

int main()
{
    for(;;){
    int func;
    int number1;
    int number2;
    cout << "Input your function (+,-,x,/,Square,Power)(1,2,3,4,5,6) ";
    cin >> func;
    cout << "input #1: ";
    cin >> number1;
    cout << "input #2: ";
    cin >> number2;
    if (func==1){
        int answer;
        answer = number1 + number2;
        cout << number1 << " + " << number2 << " = " << answer << endl;
    }
    else {
            if (func==2){
            int answer;
            answer = number1 - number2;
            cout << number1 << " - " << number2 << " = " << answer << endl;
        }
        else {
            if (func==3){
                int answer;
                answer = number1 * number2;
                cout << number1 << " x " << number2 << " = " << answer << endl;
            }
            else {
               if (func==4){
                    int answer;
                    answer = number1 / number2;
                    int R = number1 % number2;
                    cout << number1 << " / " << number2<< " = " << answer  << " R "<< R << endl;
               }
                else {
                    if (func==5){
                        int answer;
                        answer = pow(number1,0.5);
                        cout << "√" << number1 << "=" << answer << endl;
                    }
                    else {
                        if (func==6){
                            int answer;
                            answer = pow(number1,number2);
                            cout << "√" << number1 << "^" << number2 << "=" << answer << endl;
                        }
                    }
                }
            }
            }
        }

    }
    }

person Trevader24135    schedule 08.03.2014    source источник
comment
Расчеты с плавающей запятой не точны.   -  person Brian Bi    schedule 08.03.2014
comment
Вероятно, потому что вы используете int для переменных вместо double.   -  person Shafik Yaghmour    schedule 08.03.2014
comment
Вы когда-нибудь использовали else if? вы должны использовать это вместо того, чтобы продолжать делать else{if {}}   -  person stack smasher    schedule 08.03.2014
comment
Вы также можете попробовать оператор switch вместо набора операторов if-else подряд. Не в тему, а просто мысль :-)   -  person developering    schedule 08.03.2014
comment
Я скептически отношусь к тому, что это ошибка с плавающей запятой. Даже очень неточная плавающая точка может точно представлять эти числа. Вот краткий пример, показывающий, что все должно быть в порядке.   -  person Radiodef    schedule 08.03.2014
comment
К вашему сведению, C++ уже использует оператор ^, и он не обозначает мощность.   -  person Ben Voigt    schedule 23.05.2014


Ответы (3)


pow() возвращает числа с плавающей запятой. На самом деле возвращается 24.99997 или что-то подобное. Но затем вы усекаете его, присваивая ему целое число, и оно получается как 24. В этом случае можно присвоить его целому числу, потому что вы знаете, что тогда ответ всегда будет целым числом, поэтому вам нужно его округлить, а не урезать. Обычный способ округления до целого числа — добавить 0,5 следующим образом:

int answer;
answer = pow(number1,number2)+0.5;

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

person Jerry Jeremiah    schedule 08.03.2014

int answer;
^^^
answer = pow(number1,number2);

Функция pow() сначала преобразует number1 и number2 в float. Обратите внимание, что вычисления с плавающей запятой не точны, а это означает, что вы, вероятно, получите значение 24.999999 вместо точного 25. После вычисления результат приводится к int, что отрезает плавающую часть (например, 24.999999 => 24).

Попробуйте использовать float, чтобы получить результат:

float answer;
answer = pow(number1,number2);

Если вы хотите сохранить результат в int, вы должны правильно его округлить:

int answer;
answer = (int) (pow(number1,number2) + 0.5);

Чтобы продолжить чтение, ознакомьтесь с Что каждый программист должен знать об арифметике с плавающей запятой.

person herohuyongtao    schedule 08.03.2014

Попробуйте вместо этого использовать double answer;. pow возвращает число с плавающей запятой, а вы выполняете неявное приведение к int. Это вызовет поведение, которое вы видите.

person Timothy Shields    schedule 08.03.2014