Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюк при округлении 
:(
    Опции темы
odys
Дата 22.11.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.11.2008

Репутация: нет
Всего: нет



Почему функция так странно округляет...
Программа должна из числа 5.22 доставать 22 (тобиш дробную часть брать как целове число)
Код

 int Steps (double comanda)
{
  double drob;
  int int_drob, int_comanda;
  int_comanda = floor(comanda);
  drob = comanda - int_comanda;
  int_drob = floor(drob);
  cout<<" drob = "<<drob<<endl<<"int drob = "<<int_drob<<endl<<"comanda = "<<comanda<<endl<<"int_comanda = "<<int_comanda<<endl;
     while( (comanda - double(int_comanda)) > 0.0001 )
     {
       cout<<"comanda - double(int_comanda) = "<<comanda - double(int_comanda)<<endl;
      comanda = (comanda - int_comanda)*10;
       cout<<"comanda = "<<comanda<<endl;
      int_comanda = floor(comanda);
      cout<<"int_comanda = "<<int_comanda<<endl;
      drob*=10;
      cout<<"drob = "<<drob<<endl;
      int_drob = floor(drob);
       cout<<"int_drob = "<<int_drob<<endl;
     }
     int_drob = floor(drob);
 return int_drob;
}

вот что она выводит


Vvedite comandy 5.22
 drob = 0.22
int drob = 0
comanda = 5.22
int_comanda = 5
comanda - double(int_comanda) = 0.22
comanda = 2.2
int_comanda = 2
drob = 2.2
int_drob = 2
comanda - double(int_comanda) = 0.2
comanda = 2
int_comanda = 1
drob = 22
int_drob = 21
comanda - double(int_comanda) = 1
comanda = 10
int_comanda = 9
drob = 220
int_drob = 219
... и т д
Собственно вопрос по выделенному красным... почему 2 округляется до 1?
Вопрос конечно решаем... делается следующая замена в цикле while и return;
 while( ((comanda - double(int_comanda)) > 0.0001) && ((comanda - double(int_comanda))) < 0.9999)
 return int_drob+1;
Но блин... почему так округляется? 
5.1 сразу ахинею выдает... 5.222 -> 222 нормально, на 5.2222 - снова ахинея, 5.22222 - нормально и т д по четности.
Я так понимаю это связано с особенностями double... и возможно там не 2 а 1.9999999999, поэтому и округляет до 1... но как с этим бороться?
Как изменить функцию я знаю... что -то в этом роде
while( ((comanda - double(int_comanda)) > 0.0001) && ((comanda - double(int_comanda)) < 0.999)) и дальше немного в теле поизменять... Интересует сама причина этого

Это сообщение отредактировал(а) odys - 22.11.2008, 17:27
PM MAIL   Вверх
J0ker
Дата 22.11.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(odys @  22.11.2008,  17:22 Найти цитируемый пост)
Я так понимаю это связано с особенностями double... и возможно там не 2 а 1.9999999999, поэтому и округляет до 1... 

мантиса всегда представлена точно
ошибка происходит при преобразовании float в double
http://forum.vingrad.ru/forum/topic-236923...0%B8%D0%B5.html


--------------------
user posted image
PM MAIL   Вверх
sQu1rr
Дата 22.11.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(odys @  22.11.2008,  17:22 Найти цитируемый пост)
Программа должна из числа 5.22 доставать 22 (тобиш дробную часть брать как целове число)


Не пудри себе мозги, не изобретай велосипед, это немного так сказать неправильно.
Используй мою функцию, передовая ей аргумент с точкой в типе char и получишь обратно дробную часть. далее с помощью static_cast<int>(result) - если надо переводишь в int и радуешься  smile 

 smile 
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.