| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Ошибка Debugger Exception Notification |
| Автор: odys 17.11.2008, 20:36 | ||
| Программа предназначена для вывода дробной части числа - если таковая имеется, либо само число, если она отсутствует. Она работает у меня на значениях до 2 порядка, при больших выдает непонятную ошибку... Все бы ничего если бы эта прога не была частью большей - в которой тоже самое - но там вообще ничего не обрабатывает, при той же ошибке - вот код
Выдает Project Project1.exe raised exception class EOverlow with message 'Floating point overlow'. Process stopped. Use step or run to continue. Закрыл... открыл... теперь не работает при более 3 знаках... в общем не понятна мне причина сией ошибки. |
| Автор: sQu1rr 17.11.2008, 22:25 | ||||||||||
странно - обычно int main(), к тому же заканцивется
Разумеется это не причина ошибки )) И вообще ты слишком много всего наделал. Можно было проще и кстати насколько я понял
в конце main() - что бы оставить окно на экране. Лучше используй cin.get() или getch() (для старых комиляторов) Вот тебе пример твоей функции, как я бы сделал (надеюсь я правильно понял - человек вводит число - если оно дробное, то программа показывает только часть после запятой, в противном случае только целую часть)
Что хочу сказать: все уперается в точность double (если более 5 цифр в целой части, то дробная имеет максимум 4 (без округления). Так что лучше вместо double испоьзовать два __int64 (один для дробной другой для целой (ну разумеется программа для перевода char в 2 __int64) (__int64 это long long - если так удобнее). Между прочим не твоя ни моя программа не будет выводить нули после точки xD. т.к. int с не может начинаться с нулей, так что придумай алгоритм получше ;) Вот мужду прочим твоя ощибка
Что ты делаешь? 1. Пока Число I - II больше чем 0.00000001 повторять следующие действия 2. Рузельтат сделать числом I, умноженое на 10 (+1 целая цифра) 3. Число I умножить на 10 (+1 целая цифра) 4. Число II сделать равным числу I - Идем к первому пункту (т.к. число I будет равно числу II) - циклю будет бесконечным! - До четырех цифр проходило из-за специфического хранения переменных типа double. Когда дробная часть небольшая, то она на самом деле содержит к примеру не 3 числа а больше, просто в результате они округляются, а при сравнении - разные числа - Если этот же цикл использовать не для double а для другой дробной переменной (ну скажем самостоятельно созданной (с правильно выполненым хранением дробной части), то этот цикл будет бесконечным со всеми дробными частями! |
| Автор: odys 18.11.2008, 10:43 |
| sQu1rr спасибо... вы мне многое объяснили. Похоже прийдется сначала доработать эту программу, прежде чем переходить к моделированию черепашъего движения. насчет cin>>x; - учебники обычно деликатно обходят этот вопрос стороной - поэтому приходилось кустарными методами. |
| Автор: odys 18.11.2008, 11:04 | ||
насчет cin.get(); а getch() идет как синтакс ошибка. в данном примере - не рабоает
|
| Автор: sQu1rr 18.11.2008, 16:47 | ||||||||
Ну разумеется... getch() - это доисторическая версия borland компилятора - я дал просто так (вдруг вы историк или чтото типо того cin.get() - просит ввод (маскимум одного ( так как скобки пустые ) ) символа тпереь рассмотрим cin >> x; все что вводится с клавиатуры cin воспринимает, если вы заметели БЕЗ пробелов и БЕЗ конца строки -> если вы введете число 55648, что обозначает грубо говоря char * unnamed = "55648\0", то cin возьмет 55648, а /0 оставит в бефере. Это не беда, так как следующий cin >> y; тоже пропустит мимо этот символ, но вот cin.get() - воспринимет все символы -> оставшийся в буфере символ введется и программа завершится. Что бы исправить в конце нужо написать cin.get() 2 раза подрят, либо кадый раз после cin >> x; придется писать cin.get() следовательно или так:
или так:
Лучше исползовать второй варинат, чтобы не запустаться Добавлено через 14 минут и 35 секунд Кстати можешь использовать system("pause") - для того же эффекта |
| Автор: odys 18.11.2008, 17:04 |
| Спасибо за задачу) ваша программа работает весьма запутанно... теперь пытаюсь понять почему. Выводит оно дробную часть исправно - но с особенностями. 1. Если целая часть маленькая тобиш первого порядка - выводится не более 2 знаков после запятой. 2. Если целая часть большая порядка 10 в 4-6 степени - выводятся 4 знака после запятой... В общем делаю для себя... так что времени подумать уйма) спасибо за подсказку с __int64 |
| Автор: sQu1rr 18.11.2008, 18:43 |
| Да, есть у меня ошибочка могу даже подсказать какая: Что бы выдернуть дробное число, я его умножаю на некое число, кратное 10 Как я его должен получить? 10 в степени равной кол-ву чисел после запятой Как я его наше? 10 в степени равной кол-ву чисел перед запятой. Так что удачи в исправлние. Извини за ошибку - спешил ;) |
| Автор: sQu1rr 19.11.2008, 00:00 | ||
Вот поработал минут 15, сделал более приемлимую версию. Принимает до 19 знаков с каждой стороны точки... Если знаков больше, то число округляется
|
| Автор: odys 21.11.2008, 12:24 |
| Да, спасибо, программа действительно работает замечательно. Буду тоже учиться писать в хорошем стиле. |