| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > математическая ошибка при прохождении цикла |
| Автор: nubliK 20.1.2009, 02:11 | ||
Не знаю как у других, у меня почему то возникает накопление ошибки при прохождении цикла, вот код:
Компилится все правильно и работает тоже (в данном примере функция немного отличается от оригинала), дык вот если числу "A" задать значение больше 13 то цикл начинает врать на еденицу - как побороть? |
| Автор: NightmareZ 20.1.2009, 02:19 | ||
Приведённый тобой код можно заменить на такой:
И никакой цикл тебе врать ничего не будет. |
| Автор: mes 20.1.2009, 02:23 |
скорей всего из за ошибки округления цифр с плавающей запятой. исправьте цикл на абсолютный расчет или избавьтесь от плавающих значений. хм... непонятно как из примера ТС, Вы получили такой код |
| Автор: nubliK 20.1.2009, 04:10 | ||||||
Бред сивой кобылы мягко говоря. Смотри код внимательно.
Как это сделать? и переменная обязательно должна быть с плавающей точкой. Вычитаемое может быть и не 0.1 но и 0.05 и хоть десять. Добавлено через 12 минут и 55 секунд прошу прощение за грубость у NightmareZ =) |
| Автор: nubliK 20.1.2009, 06:40 |
| нашел небольшую статейку по теме тут http://xpoint.ru/know-how/Articles/FloatingPointNumbers?comments но вопрос остался в силе =) И еще если это никого не затруднит не могли бы вы привести пример варианта как можно задать точность округления числа с плавающей точкой (то есть точность до определенного знака). |
| Автор: ksili 20.1.2009, 06:49 |
| Можно использовать числа с плавающей точкой двойной точности - тип double. Или в крайнем случае - расширенной точности (long double). Указать точность округления до определенного знака при вычислениях не получится. |
| Автор: Kurganec 20.1.2009, 07:23 |
| попробуй while(A > 6.) //с точкой или while(A>6.*0.99999) // близкий к 100% последнее конечно бред, но у меня тоже проблемы в своё время были при сравнении вещественных переменных, с целыми. отпишись тока |
| Автор: nubliK 20.1.2009, 07:44 | ||
Всем огромное спасибо, вот мое решение получилось так:
Получается что компу нехватает точности чтобы хранить число с плавающей точкой - соответственно решение получилось через приведение типов от double к float =) Если кто придумает правельнее то ХАЧУ! кстати тут вот подобная дисскуссия вилась и слизал идею я отсюда http://forum.codenet.ru/archive/index.php/t-24605.html |
| Автор: vinter 20.1.2009, 08:52 | ||
|
| Автор: maxim1000 20.1.2009, 09:31 | ||
а если так:
хотя, конечно, это уже хак не все числа в компьютере представляются неточно те, которые в двоичном виде представляются в виде конечных (и не очень длинных) дробей, по идее, должны представляться точно, хотя это уже похоже на деталь реализации, к которой не стоит привязываться... Добавлено через 1 минуту и 3 секунды что-то здесь забыто: цикл либо не выполнится (если условие изначально ложное), либо будет бесконечным |
| Автор: vinter 20.1.2009, 09:43 |
| maxim1000, спасибо, исправил |
| Автор: nubliK 20.1.2009, 13:14 | ||
А вот и правильный ответ:
Спасибо товарищу mes т.к. он прав что в таких случаях лучший вариант уйти от плавающей точки. |
| Автор: baldina 20.1.2009, 18:11 | ||||||||
mes:
данный случай настолько прост, что его даже обсуждать не стоит: здесь вообще цикл не нужен. а вот если он нужен, то, например, вместо
делаем
сравнение чисел с плавающей можно производить так:
|
| Автор: baldina 20.1.2009, 19:32 |
| они уже давно появились. некоторых еще на свете не было http://chernykh.net/content/view/236/252/ |
| Автор: GoldFinch 20.1.2009, 21:12 |
| baldina, а ссылку на компилятор С/С++ для таких машин подкинете? |
| Автор: baldina 20.1.2009, 21:53 |
| не кину. да и зачем компилятор без машины? |