Форум программистов, компьютерный форум CyberForum.ru

Ошибка в типе переменной - C++

Восстановить пароль Регистрация
 
Harmonster
9 / 9 / 3
Регистрация: 20.05.2012
Сообщений: 101
20.05.2012, 06:53     Ошибка в типе переменной #1
Здравствуйте, у меня проблема. Дали задачу, решаю не сразу все, а по кусочкам...
первый кусок самый простой, возвести число в нужную степень. Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
 
int main()
{
    int x;
    int y;
    long long n;
    cout << "Vvedite chislo = ";
         cin >> x;
    cout << "Vvedite stepen' = ";
         cin >> y;
    cout << "\n";
    n = pow(x,y);
    cout << "\n";
    cout << "Chislo " << x << " v stepeni " << y << " ravno " << n;
    getch();
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
 
int main()
{
    int x;
    int y;
    double n;
    cout << "Vvedite chislo = ";
         cin >> x;
    cout << "Vvedite stepen' = ";
         cin >> y;
    cout << "\n";
    n = pow(x,y);
    cout << "\n";
    cout << "Chislo " << x << " v stepeni " << y << " ravno " << n;
    getch();
}
Когда у нас n имеет тип long long:
Беру в пример x = 5, и y = 3 результат программы 124 + показывает большие числа, например 9 в 9 показывает 387420489

Когда n имеет тип double:
Опять же, х = 5, и у = 3 результат 125 + не показывает большие числа, например 5 в 9 получается 1.95313e+006

Вообщем, как понятно что программа считает не правильно, изза типа переменной (скриншоты прикреплены). Что делать? С++ только начал изучать... Нигде не могу найти решение, набераю код и компилирую в Dev-C++ v4.9.9.2
Миниатюры
Ошибка в типе переменной   Ошибка в типе переменной  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2012, 06:53     Ошибка в типе переменной
Посмотрите здесь:

Вопрос нуба о типе STRING C++
C++ Не могу разобраться в типе string
Тривиальная ошибка при типе string C++
C++ Ошибка в возвращаемом типе
Ошибка в функции из за переменной C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dima_c8
 Аватар для Dima_c8
4 / 4 / 0
Регистрация: 17.12.2011
Сообщений: 148
20.05.2012, 08:05     Ошибка в типе переменной #2
Попробуйте когда обявляете все переменные присвоить всем переменным значение ноль и запустите программу и посматрите где вывело значение ноль та переменная не инициализируется.И зачем n тип double если первые две переменные целые n тоже нужен тип целого числа
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.05.2012, 08:40     Ошибка в типе переменной #3
Цитата Сообщение от Harmonster Посмотреть сообщение
например 9 в 9 показывает 387420489
Все верно показывает, 99 == 387420489. По поводу 124 вместо 125 - каким компилятором пользуетесь? Функция pow() возвращает вещественный тип. При приведении к целочисленному типу отсекается дробная часть. Не раз замечал на форуме жалобы о потере единицы при приведении типа.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.05.2012, 08:42     Ошибка в типе переменной #4
pow довольно неточная штука при больших числах.
Тут правильнее будет написать свою функцию возведения в степень.
Harmonster
9 / 9 / 3
Регистрация: 20.05.2012
Сообщений: 101
20.05.2012, 08:49  [ТС]     Ошибка в типе переменной #5
Цитата Сообщение от Dima_c8 Посмотреть сообщение
Попробуйте когда обявляете все переменные присвоить всем переменным значение ноль и запустите программу и посматрите где вывело значение ноль та переменная не инициализируется.И зачем n тип double если первые две переменные целые n тоже нужен тип целого числа
Попробовал ввести нули обоим переменным, получилась единица (по закону математики, любое число в нулевой степени равно единице).


Цитата Сообщение от Toshkarik Посмотреть сообщение
Все верно показывает, 99 == 387420489. По поводу 124 вместо 125 - каким компилятором пользуетесь? Функция pow() возвращает вещественный тип. При приведении к целочисленному типу отсекается дробная часть. Не раз замечал на форуме жалобы о потере единицы при приведении типа.
Dev-C++ v4.9.9.2, компилятор встроенный в эту же программу (о чем я, собственно и написал выше).

Цитата Сообщение от diagon Посмотреть сообщение
pow довольно неточная штука при больших числах.
Тут правильнее будет написать свою функцию возведения в степень.
Тоесть получается, написать одномерный массив, умножающий число само на себя n-ое количество раз?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.05.2012, 08:56     Ошибка в типе переменной #6
Цитата Сообщение от Harmonster Посмотреть сообщение
написать одномерный массив
При чем тут массив то?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
long int power( const long int base, const long int exponent ) {
   if ( base == 0 )
      return 0;
 
   if ( exponent == 0 )
      return 1;
 
   long int n = base;
 
   for ( long int i = 1; i < exponent; i++ )
      n *= base;
 
   return n;
}
Ну это конечно общий вариант, для не отрицательных чисел.
Harmonster
9 / 9 / 3
Регистрация: 20.05.2012
Сообщений: 101
20.05.2012, 08:58  [ТС]     Ошибка в типе переменной #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
При чем тут массив то?
C++
1
2
3
4
5
6
7
8
long int power( const long int base, const long int exponent ) {
   long int n = base;
 
   for ( long int i = 1; i < exponent; i++ )
      n *= base;
 
   return n;
}
Извиняюсь, но я когда изучал паскаль, нам говорили чтоб более точно возвести в рандомную степень, нужно написать одномерный массив. Спасибо за помощь!
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
20.05.2012, 15:36     Ошибка в типе переменной #8
Цитата Сообщение от Harmonster Посмотреть сообщение
не показывает большие числа, например 5 в 9 получается 1.95313e+006
C++
1
cout.flags(ios::fixed);
Цитата Сообщение от Harmonster Посмотреть сообщение
Когда у нас n имеет тип long long:
Беру в пример x = 5, и y = 3 результат программы 124
Используйте С++'ой заголовочный файл cmath.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.05.2012, 15:48     Ошибка в типе переменной #9
Цитата Сообщение от kazak Посмотреть сообщение
Используйте С++'ой заголовочный файл cmath.
И как это может повлиять на результат?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
20.05.2012, 15:51     Ошибка в типе переменной #10
Представте себе, cmath'ая pow дает правильный результат А вот Сишная нет, не знаю почему.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.05.2012, 15:55     Ошибка в типе переменной #11
Странно, у меня на GCC 4.7 выдает одинаковые верные результаты. Вот тут тоже проверял. У автора Dev C++, который тоже использует GCC, только ранней версии. А Вы чем компилировали?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
20.05.2012, 16:06     Ошибка в типе переменной #12
Dev-Cpp, если верить внутренностям то mingw32-gcc3.4.2. Билдер тоже нормально работает.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.05.2012, 16:14     Ошибка в типе переменной #13
Похоже это баг GCC 3.4, если верить bug-трекеру.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 16:18     Ошибка в типе переменной
Еще ссылки по теме:

C++ Ошибка в типе данных
ошибка с выводом переменной C++
C++ Ошибка в типе данных 'String' and 'System::String'

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
20.05.2012, 16:18     Ошибка в типе переменной #14
Бывает же
Yandex
Объявления
20.05.2012, 16:18     Ошибка в типе переменной
Ответ Создать тему
Опции темы

Текущее время: 13:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru