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

Неточность операций с float - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
JuzTosS
0 / 0 / 0
Регистрация: 03.03.2010
Сообщений: 8
20.05.2010, 15:48     Неточность операций с float #1
Здравствуйте.

У меня в цикле осуществляется итерация вида float time += 0.1;
при этом возникает ошибка, например 0.3 + 0.1 = 0.400....001;
или 0.3 + 0.1 = 0.399...999;

В принципе мне это не очень важно,
но непонятно из-за чего это происходит...

Спасибо за ответы.

Картика прилагается =)
Миниатюры
Неточность операций с float  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
20.05.2010, 15:53     Неточность операций с float #2
в программировании на встроенных вещественных типах невозможно получить точное значение и то о чем вы спрашиваете - это вполне нормально, поэтому можете просто не обращать на это внимание
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
20.05.2010, 19:18     Неточность операций с float #3
таковы особенности структуры хранения переменной float, если хочешь точности используй double с ней такого мной замечено не было.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.05.2010, 19:39     Неточность операций с float #4
как сказал уже M128K145 есть особенности перевода из десятичной в двоичную систему вещественных чисел, которая приводит к тому что уже число само по себе невозможно представить точно, даже не трогая его
Цитата Сообщение от JuzTosS Посмотреть сообщение
float time += 0.1;
C++
1
2
3
4
for( int i=0;i<=100;++i ){
  float time = 0.1 * i;
  ...
}
так вы гарантируете своевременный выход из цикла
Syndarin
13 / 13 / 1
Регистрация: 15.09.2009
Сообщений: 57
20.05.2010, 19:43     Неточность операций с float #5
Ох, меня преподаватель такой же штукой озадачил, типа, на сообразительность. Признаюсь, соображал часа два)))

тип double лично в моем примере не помог.

Я использовал такую проверку на равенство нулю (подразумевая, что цифры, младше тысячных, меня не интересуют)
C
1
fabs(0-MyFloat)<0.001
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
21.05.2010, 09:38     Неточность операций с float #6
таковы особенности структуры хранения переменной float, если хочешь точности используй double с ней такого мной замечено не было.
Это особенности представления вещественных чисел вообще.
Поэтому что float, что double, что long double - везде это есть.
У double просто выше точность
JuzTosS
0 / 0 / 0
Регистрация: 03.03.2010
Сообщений: 8
27.05.2010, 12:27  [ТС]     Неточность операций с float #7
хмм... нашёл интересную настройку в свойствах проекта:
Думаю, что она может на это повлиять, однако пока не экспериментировал...
Миниатюры
Неточность операций с float  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2010, 13:17     Неточность операций с float
Еще ссылки по теме:

Неточность в понимании условия задачи "Жук" (acmp) C++
C++ Неточность результата
C++ Чем отличаются float преобразования (float)var от float(var)

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

Или воспользуйтесь поиском по форуму:
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
27.05.2010, 13:17     Неточность операций с float #8
Можно сделать так
C
1
2
3
4
  char s[20];
  time += 0.1;
  sprintf(s, "%.1f", time);
  time = atof(s);
Функция sprintf (и ей подобные) вполне грамотно работает с округлением
А double все же лучше. Тем более что все сишные функции все равно к нему float приводят
Yandex
Объявления
27.05.2010, 13:17     Неточность операций с float
Ответ Создать тему
Опции темы

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