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

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

Войти
Регистрация
Восстановить пароль
 
etsetere
0 / 0 / 0
Регистрация: 23.11.2012
Сообщений: 6
#1

Проблемы с переполнением - C++

03.03.2013, 23:35. Просмотров 331. Ответов 2
Метки нет (Все метки)

Программа реализует ряд Фибоначчи с остановкой после переполнения unsigned long. Но она, почему-то, даже после выхода за диапазон продолжает вычисления. Подскажите, пожалуйста, в чем ошибка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <string>
using namespace std;
int main ()
{
unsigned long int n=0,n1=0,n2=1,l=0;
while (l<47)
{
n=n1+n2;
if (n>ULONG_MAX)  {cout<<"Error";break;}
n1=n2;
n2=n;
cout << n<<endl;
l=l++;
}
cout << ULONG_MAX<<endl;
getchar();
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2013, 23:35     Проблемы с переполнением
Посмотрите здесь:

C++ Проблемы с gets
проблемы c codeBlocks 10.05 C++
C++ Проблемы с наследованием
C++ проблемы с ООП
Проблемы с C++ C++
C++ Проблемы с наследованием
C++ Проблемы с программой
Проблемы с компиляцией C++
C++ Проблемы с анимацией
C++ Ошибка, связанная с переполнением буфера
Пытаюсь разбираться с переполнением буфера в куче C++
Редкая ошибка, связанная с переполнением стека C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
2461 / 1683 / 216
Регистрация: 08.06.2007
Сообщений: 6,647
Записей в блоге: 4
03.03.2013, 23:51     Проблемы с переполнением #2
Цитата Сообщение от etsetere Посмотреть сообщение
n>ULONG_MAX
Число типа unsigned long не может превышать ULONG_MAX по определению ULONG_MAX.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
04.03.2013, 09:09     Проблемы с переполнением #3
ага. В контексте данной задачи, ты можешь сравнивать новое число с предыдущим. Полагая, что если происходит переполнение, новое значение не будет больше предыдущего члена.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <string>
using namespace std;
int main ()
{
unsigned long int n=0,n1=0,n2=1,l=0;
while (l<47)
{
n=n1+n2;
if (n < n2)  {cout<<"\n\nError: the number value has became less then previous. The last value equaled to " << n;break;}
n1=n2;
n2=n;
cout << n<<endl;
l=l++;
}
cout << "\nULONG_MAX=" << ULONG_MAX<<endl;
getchar();
return 0;
}
Впрочем, мне не нравится предложенный мной вариант)

Добавлено через 13 минут
другой вариант - лучший. НЕ использовать unsigned в целях предоставления лишнего бита. Тогда в контексте этой задачи - можно каждое новое полученное число сравнивать с 0. Если произойдет переполнение сверху - знаковое число гарантированно сменит знак. Этот факт можно сделать условием выхода из цикла.
Yandex
Объявления
04.03.2013, 09:09     Проблемы с переполнением
Ответ Создать тему
Опции темы

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