![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: 1 Всего: 1 |
Доброе время суток.
Суть задачи: Есть число тип double, надо его дробную часть перевсетив int. Тоесть double( 121,322 ) = int( 322 ) Напсал я фун-цию, вроде все правильно и вот какой баг int qpart( double, int& ) - если в double передать (0,21) то все ок, а если передать 1,21 то функция уходт в вечный цикл.... Думал это баг gcc, компилил только что в VC 6.0 тот-же результат Объясните что я не правильно делаю... Вот собственно код
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
С отладчиком умеем работать? Так посмотри, почему программа из цикла не выходит.
Скорее всего, из-за невыполнения условия: нельзя сравнивать double-значения точно, и надеяться, что будет работать. А сравнивать надо так: fabs(a-b) <= eps, где в качестве eps можно выбрать, например, MIN_FLOAT. -------------------- ... |
|||
|
||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: 1 Всего: 1 |
Earnest, за пример сравнения спасибо конечно..
только я понимаю что нельза сравнивать double и int, поэтому вот и пишу while( ( dval - i ) != 0 ) - так можно, проблемма вовсе не в этом вот в чем проблемма ... printf( "dval=%f\t\ti=%i\n", dval, i ); ... результат dval=2.100000 i=2 dval=21.000000 i=20 dval=210.000000 i=209 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Не понимаешь похоже. Уверен? Что это, как не сравнение double. Может ты думаешь, что здесь инты сравниваются? Я, собственно, об этом. А вот это уже совсем другая проблема... То, что выглядит как 210, вполне может на самом деле быть 209,9999999... Но это я могу только гадать, а у тебя, повторяю, отладчик есть. Вот и посмотри. -------------------- ... |
|||
|
||||
| oper54 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: 1 Всего: 1 |
не я уверен что там будит double сравниаться с "0"
отладчик выдает тоже самое что и printf... если ты про асм то я на низком уровне не с машиной не общаюсь Тут вот какая странность что если в фу-цию передать не 1,21 а 0,21 то все в порядке.... П.С. такая простая задачка, а я уже два дня торможу |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Так с чего ты взял, что твой double 0 точно равен? А сравниваешь на точное равенство.
У тебя вообще строка "dval=210.000000 i=209" не должна печататься по логике алгоритма - программа должна выйти их цикла на предыдущей итерации. Но не выходит. Потому что не срабатывает условие. Потому что оно не правильно написано. !!!!!! Добавлено @ 14:11 И нечего мучаться над разной работой с 1,21 и 0,21. Это в десятичном представлении они похожи. А в двоичном (как их компьютер видит) - ничего общего. -------------------- ... |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 8 Всего: 146 |
dval=2.133000 i=2
dval=21.330000 i=21 dval=213.300000 i=213 dval=2133.000000 i=2132 dval=21330.000000 i=21330 i = 21330 У меня такой результат от исходника из первого поста, че нужно то? Добавлено @ 14:39 и чем floor и ceil не подходят? Добавлено @ 14:50
Может так те подойдет? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: 1 Всего: 1 |
Romikgy, проблема в том что если в ф-цию передать 0,2123 то все ок, а если передать что то вроде 654,2123 не работает! Еще один вариант и все равно не работает ( Earnest + Romikgy ).....
|
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да не "не равно"! А "больше или равно"!
А у тебя что получилось? Пока эта разница не равна MIN_DOUBLE цикл работает ... А надо: пока разница ненулевая (т.е. больше эпсилон) ... Да ты еще и MIN_DOUBLE нулем сделал... Что в лоб, что по лбу. Надо, например:
И лучше константу использовать, чем макрос. И не нужны никакие floor... У тебя нормальнгый алгоритм... Знание C вот... хромает ... -------------------- ... |
||||
|
|||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: 1 Всего: 1 |
а что тут есть le? |
|||
|
||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: 1 Всего: 1 |
а понял, торможу... 1e-10
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
это не LE а 1(один)e
1*10 в -10-й степени -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| oper54 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 13.5.2005 Репутация: 1 Всего: 1 |
спасиб, теперь работает...
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ну слава богу, поздравляю
Закрывай вопрос-то. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |