Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

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

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

20.05.2010, 15:48. Просмотров 1639. Ответов 7
Метки нет (Все метки)

Здравствуйте.

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

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

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

Картика прилагается =)
0
Миниатюры
Неточность операций с float  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2010, 15:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неточность операций с float (C++):

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing - C++
#include<stdio.h> #include<stdlib.h> #include<math.h> float f1(float x)/*vira*enie 1*/ {return (x*cos(x))/(1+ pow(x,2));} ...

Чем отличаются float преобразования (float)var от float(var) - C++
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

Неточность результата - C++
Напишите программу, которая выдавала бы запрос на ввод расхода бензина в европейском стиле (количество литров на 100 км) и преобразовывала...

cannot convert `float' to `float*. Почему так происходит? - C++
всем привет, помогите исправить ошибки... а то голова мало варит уже, а завтра надо сдать уже #include <stdio.h> #include <stdlib.h>...

неверное приведение void* к *float а далее к float - C++
Почему когда привожу void* к int* потом к int то все работает, данные не бьются и работают нормально, когда делаю те же операции но с...

invalid types `float[float]' for array subscript - C++
void SEARCH(float vol, float price, int i) { if (i>N) { if(price>maxprice) { ...

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

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

Я использовал такую проверку на равенство нулю (подразумевая, что цифры, младше тысячных, меня не интересуют)
C
1
fabs(0-MyFloat)<0.001
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
21.05.2010, 09:38 #6
таковы особенности структуры хранения переменной float, если хочешь точности используй double с ней такого мной замечено не было.
Это особенности представления вещественных чисел вообще.
Поэтому что float, что double, что long double - везде это есть.
У double просто выше точность
0
JuzTosS
0 / 0 / 0
Регистрация: 03.03.2010
Сообщений: 8
27.05.2010, 12:27  [ТС] #7
хмм... нашёл интересную настройку в свойствах проекта:
Думаю, что она может на это повлиять, однако пока не экспериментировал...
0
Миниатюры
Неточность операций с float  
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
27.05.2010, 13:17 #8
Можно сделать так
C
1
2
3
4
  char s[20];
  time += 0.1;
  sprintf(s, "%.1f", time);
  time = atof(s);
Функция sprintf (и ей подобные) вполне грамотно работает с округлением
А double все же лучше. Тем более что все сишные функции все равно к нему float приводят
0
27.05.2010, 13:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2010, 13:17
Привет! Вот еще темы с ответами:

Неточность конвертера валюты - C++
Вопрос наверное, такой нубский, но автор видеоуроков мне в скайпе не отвечает и я хочу спросить у вас. В чем проблема? Точность в...

Подскажите в чем неточность - C++
Добрый день. Хочу немного узнать С++ Для начала хотел скачать кимпилятор. Скачал MinGW Далее скачал еклипс. Начал немного розбираться....

Неточность функции поиска угла - C++
написал функцию нахождения угла по 3-м точкам int LengthBetweenPoints(point a,point b) { return...

Ошибка cannot convert 'float' to 'float*' - C++
Здравствуйте, что означает error: cannot convert 'float' to 'float*' for argument '1' to 'int mas_time(float*, int)'? Из-за чего она...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru