Страница 1 из 3
переменная типа Float ?????
Добавлено: Ср апр 04, 2012 18:30:20
mas_43
Добрый день. Помогите разобраться с задачей.
Есть компилятор codevision есть переменная типа Float, я в цикле прибавляю к ней 0,01 и сравниваю с заданным значением другой переменной float а результата никакого.
В протэусе проверяю и видно что у переменной появляются левые значения.
Например 0+0,01+0,01+0,01+0,01=0,04000999
Почему так ???????????????????????????
Подскажите пожалуйста!
Re: переменная типа Float ?????
Добавлено: Ср апр 04, 2012 18:35:03
ploop
Почитайте про представление чисел в памяти.
Например в Вики
Re: переменная типа Float ?????
Добавлено: Ср апр 04, 2012 18:51:39
mas_43
*************************************************
Если обозначить машинный порядок Мр, а математический — р, то связь между ними ыразится такой формулой:
Мр = р + 64.
Итак, машинный порядок смещен относительно математического на 64 единицы и имеет только положительные значения. При выполнении вычислений с плавающей точкой процессор это смещение учитывает.
*************************************************
В этом что ли дело ??????

Re: переменная типа Float ?????
Добавлено: Чт апр 05, 2012 00:14:51
Jack_A
Не в этом. Дело в том, что числа, точно представленные в десятичной арифметике, могут быть не представимы точно в двоичной. Кроме того, из-за конечной длины мантиссы при сложении, когда происходит выравнивание порядков, младшие разряды меньшего числа "уплывают" за пределы разрядной сетки. Мы можем до посинения к 1 миллиаду прибавлять 0.0000001 - результат не изменится.
Re: переменная типа Float ?????
Добавлено: Чт апр 05, 2012 06:51:40
ploop
Даже если забыть по числа с плавающей запятой, а взять с фиксированной. Пусть будет дробная часть в 4 разряда, т.е. самое маленькое число мы можем представить 0.0625
Казалось бы - 4 знака после запятой, но это в десятичной. Вот 0,0626 мы уже не можем записать. Следующее будет 0.125, потом - 0.1875 и так далее.
Re: переменная типа Float ?????
Добавлено: Чт апр 05, 2012 07:08:18
pyzhman
mas_43 писал(а): Например 0+0,01+0,01+0,01+0,01=0,04000999
Господа! Разница на два порядка - катастрофа?
2
mas_43: CVAVR довольно интересно обращается с плавающей запятой. Уж так написана библиотека. (За что, уверен, поминают ее автора недобрым словом.) Я в свое время набарахтался. Ныне очень аккуратно с ней обращаюсь. При первой же возможности вообще не использую.
Re: переменная типа Float ?????
Добавлено: Чт апр 05, 2012 10:57:06
Jack_A
pyzhman писал(а):
Господа! Разница на два порядка - катастрофа?
На два порядка - т.е. приблизительно в 100 раз -- конечно, катастрофа.
А при соблюдении несложных правил, основанных на знании float арифметики, она не так и страшна. Например, при суммировании большого числа данных для уменьшения потери точности рекомендуется провести сортировку их и суммировать, начиная с самых меньших по абс. величине. Такие маленькие хитрости делают жизнь не такой мрачной, какой она иногда может казаться.
Re: переменная типа Float ?????
Добавлено: Чт апр 05, 2012 12:15:35
pyzhman
Вижу неверно понят. К 100 прибавить 1 для компьютера задача, допускающая разброс?
Re: переменная типа Float ?????
Добавлено: Чт апр 05, 2012 19:22:04
mas_43
Спасибо за ответ !!! перейду на int и не буду пока париться потом когда нибудь разберусь

Re: переменная типа Float ?????
Добавлено: Чт апр 05, 2012 23:02:14
Jack_A
pyzhman : Отож ! Я бы начинающим программерам дал напутствие, слегка модифицировав текст из Библии : "Не употребляй переменную типа Float всуе"

Re: переменная типа Float ?????
Добавлено: Чт апр 05, 2012 23:46:37
YS
Тут поможет несколько простых правил:
1. При программировании микроконтроллеров плавающую запятую лучше не использовать. В 99.9% случаев достаточно фиксированной запятой - т.е., просто работы с числами, умноженными на 10ⁿ.
2. Если очень хочется использовать float, лучше не использовать float.
3. Вещественные числа никогда не сравнивают "в лоб", т.е., оператором "==". В 99.99% случаев они не будут равны из-за описанной выше ошибки представления / конечной точности вычислений. Адекватное решение - проверять на попадание в некий интервал.
Re: переменная типа Float ?????
Добавлено: Пт апр 06, 2012 17:49:25
siamds
При разработке микроконтроллерных устройств измерения, контроля, а также автоматической регулировки технологических параметров просто не обойтись без использования функции float. Ниже привожу фрагмент программы использования данной функции. В прикрепленном файле Proteus наглядно показана работа функции float при задании и измерении тока. Вы же имея перед глазами приведенный пример можете адаптировать его к собственным нуждам.
//******* Глобальные переменные *******
float ka=0.009785; //коэффициент пересчета тока для 10А
unsigned int integer_a; //целая часть числа функции измерения канала тока
long int xa,ya,za; //Дробная часть функции вычислений тока
float result_a; //результат преобразования задания тока
float temp_a,*ba; //Промежуточный результат вычислений тока
//********* Вычисление данных АЦП измерения тока *********
result_a= adc_data[0]*ka; //результат преобразования АЦП тока ADC0
integer_a= floor(result_a); //функция floor возвращает ближайшее целое число
temp_a= modf(result_a,ba); //функция modf разделяет число на целую и дробную части
temp_a= temp_a*1000; //округление до тысячных (темп*1000)
//Стандартный цикл математических вычислений
xa = temp_a/100; //Десятые
temp_a= temp_a-xa*100;
ya=temp_a/10; //Сотые
temp_a = temp_a-ya*10;
za = temp_a; //Тысячные
Re: переменная типа Float ?????
Добавлено: Сб апр 07, 2012 00:29:24
Jack_A
Не буквоедства ради, а только ради истины : Float это вообще-то тип данных, а не функция...
Re: переменная типа Float ?????
Добавлено: Сб апр 07, 2012 17:43:13
YS
Во-первых да, float - не функция, а тип данных.
Во вторых,
При разработке микроконтроллерных устройств измерения, контроля, а также автоматической регулировки технологических параметров просто не обойтись без использования функции float
... если аффтар не знает про числа с фиксированной запятой и не умеет адаптировать формулы под них. Практически любую формулу можно адаптировать так, что она влезет в целочисленные вычисления. Данные от DS18B20 Вы тоже прямым текстом на 0.0625 умножать будете?
bl, bh - данные из датчика, соответственно младший и старший байт. Получаем значение температуры до второго знака, умноженное на 10:
Код: Выделить всё
tempr=(int8_t)(((bl | (bh << 8)) * 625UL) / 1000UL);
- то же самое, что
Код: Выделить всё
tempr=(uint8_t)(((bl | ((uint16_t)bh << 8)) * 0.0625) * 10);
Целочисленные вычисления быстрее, точнее и занимают меньший объем кода.
Re: переменная типа Float ?????
Добавлено: Сб апр 07, 2012 20:42:25
ploop
Целочисленные вычисления быстрее, точнее и занимают меньший объем кода.
... и отлично оптимизируются, если данное действо разрешено.
Re: переменная типа Float ?????
Добавлено: Вс апр 08, 2012 09:36:45
siamds
Jack_A писал(а):Не буквоедства ради, а только ради истины : Float это вообще-то тип данных, а не функция...
YS Во-первых да, float - не функция, а тип данных.
Господа! С Вами мне все понятно, но меня удивляет другое: как же Вы можете давать советы, если сами не знаете что
float – это не только тип данных но и математическая функция. Просмотрите “Стандартные библиотечные функции ” CV-AVR, (подраздел “Математические функции”) и вопросы отпадут сами собой.
Теперь по выводу данных от температурного датчика DS1820. Здесь формула ещё проще. Используя библиотечные функции датчика, программа вывода укладывается всего в две строчки без использования
float и прочих старших и младших байтов (хотя и здесь можно применить функцию
float – но просто не имеет смысла перегружать программу).
Re: переменная типа Float ?????
Добавлено: Вс апр 08, 2012 14:06:57
YS
Просмотрите “Стандартные библиотечные функции ” CV-AVR, (подраздел “Математические функции”)
Да, мы знаем, что CVAVR
нарушает добавляет много правил в стандарт С.

И, как и все адекватные люди, советуем по-возможности как можно меньше использовать нестандартные элементы.
Почитайте стандарт ANSI C. Последний на сегодняшний момент - С99. А чего там напридумывали создатели CVAVR, я не знаю.
И да, я почитал
мануал по CVAVR, раздел 4.4, "Mathematical functions". Нету там
функции float. По крайней мере, я не нашел. Может, Вам попался кривой русский перевод?

Или я плохо смотрел?
Re: переменная типа Float ?????
Добавлено: Вс апр 08, 2012 16:53:09
siamds
Мы с Вами пользуемся одним и тем же мануалом. Так вот в разделе
4.4, "Mathematical functions" на странице 104 функция float встречается 3 раза,
на странице 105 – 10 раз, а на странице 106 – 11 раз.
Просмотрите мануал более внимательно
Re: переменная типа Float ?????
Добавлено: Вс апр 08, 2012 20:37:00
ploop
4.4, "Mathematical functions" на странице 104 функция float встречается 3 раза
Похоже вы чего-то путаете. Я хоть CV не пользовался ни разу, но могу точно сказать - такой функции быть не должно. И посмотрел документ, никакой подобной функции не увидел. Это только тип данных, который используется в других функциях.
Re: переменная типа Float ?????
Добавлено: Вс апр 08, 2012 21:16:07
phanis
К примеру
Возвращает абсолютное значение числа с плавающей запятой х
float-тип данных который вернет функция fabs(float x)
например если было бы так
char - от этого не стал бы функцией