Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Harmonster
9 / 9 / 3
Регистрация: 20.05.2012
Сообщений: 101
#1

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

20.05.2012, 06:53. Просмотров 732. Ответов 13
Метки нет (Все метки)

Здравствуйте, у меня проблема. Дали задачу, решаю не сразу все, а по кусочкам...
первый кусок самый простой, возвести число в нужную степень. Код:

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
0
Миниатюры
Ошибка в типе переменной   Ошибка в типе переменной  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2012, 06:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка в типе переменной (C++):

Ошибка в типе переменных - C++
Подскажите пожалуйста в чем ошибка. Есть задача:&quot;Задать массив структур «ведомость» (сдачи экзамена). Распределить память для элементов...

Ошибка в типе данных - C++
недавно начала учиться программировать в си++, не могу понять в чем ошибка: нужно написать программу,которая бы считала среднее...

Ошибка в возвращаемом типе - C++
Помогите пожалуйста, у меня уже волосы дыбом встают. Почему компилятор ругается на это... template&lt;typename _My&gt; iterator...

Тривиальная ошибка при типе string - C++
Написал код для сортировки текста в алфавитном порядке. Делал все вроде правильно, как говорится, по книжке, но при компиляции выдает очень...

Ошибка в типе данных 'String' and 'System::String' - C++
Всем привет. помогите, выдает ошибку File1.cpp(40): E2015 Ambiguity between 'String' and 'System::String' ...

Информация о типе - C++
Есть ли в сях возможность прочитать класс объекта в строку, заканчивающуюся нулём? Известно, что базовый класс имеет виртуальные члены. Не...

13
Dima_c8
4 / 4 / 0
Регистрация: 17.12.2011
Сообщений: 148
20.05.2012, 08:05 #2
Попробуйте когда обявляете все переменные присвоить всем переменным значение ноль и запустите программу и посматрите где вывело значение ноль та переменная не инициализируется.И зачем n тип double если первые две переменные целые n тоже нужен тип целого числа
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.05.2012, 08:40 #3
Цитата Сообщение от Harmonster Посмотреть сообщение
например 9 в 9 показывает 387420489
Все верно показывает, 99 == 387420489. По поводу 124 вместо 125 - каким компилятором пользуетесь? Функция pow() возвращает вещественный тип. При приведении к целочисленному типу отсекается дробная часть. Не раз замечал на форуме жалобы о потере единицы при приведении типа.
0
diagon
Higher
1936 / 1202 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.05.2012, 08:42 #4
pow довольно неточная штука при больших числах.
Тут правильнее будет написать свою функцию возведения в степень.
0
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-ое количество раз?
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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;
}
Ну это конечно общий вариант, для не отрицательных чисел.
1
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;
}
Извиняюсь, но я когда изучал паскаль, нам говорили чтоб более точно возвести в рандомную степень, нужно написать одномерный массив. Спасибо за помощь!
0
kazak
3057 / 2378 / 160
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
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.
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.05.2012, 15:48 #9
Цитата Сообщение от kazak Посмотреть сообщение
Используйте С++'ой заголовочный файл cmath.
И как это может повлиять на результат?
0
kazak
3057 / 2378 / 160
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
20.05.2012, 15:51 #10
Представте себе, cmath'ая pow дает правильный результат А вот Сишная нет, не знаю почему.
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.05.2012, 15:55 #11
Странно, у меня на GCC 4.7 выдает одинаковые верные результаты. Вот тут тоже проверял. У автора Dev C++, который тоже использует GCC, только ранней версии. А Вы чем компилировали?
0
kazak
3057 / 2378 / 160
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
20.05.2012, 16:06 #12
Dev-Cpp, если верить внутренностям то mingw32-gcc3.4.2. Билдер тоже нормально работает.
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.05.2012, 16:14 #13
Похоже это баг GCC 3.4, если верить bug-трекеру.
0
kazak
3057 / 2378 / 160
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
20.05.2012, 16:18 #14
Бывает же
0
20.05.2012, 16:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 16:18
Привет! Вот еще темы с ответами:

a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной c,среднее переменной b - C++
даны произвольные числа a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной c,среднее переменной b.

Битовые операции на длинном типе - C++
Написал алгоритм, все работает на малых числах, на больших - нет. Выяснил, что проблема в том, что const unsigned long long int a =...

Где можно узнать о типе HDC? - C++
Не подскажете, где можно узнать о типе HDC?

ошибка с выводом переменной - C++
можете подсказать, в чем ошибка? неправильно выводитпеременную &quot;мин&quot;, я канешно не совсем дурак, но должно выводить правильно, а оно вы...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru