Всем привет! У меня возникла проблема при выводе переменной типа float на экран lcd 1602, подключённый через I2C. Переменная выводится на экран, но иногда вместо корректного значения выводится надпись "inf". Попробовал передавать значения переменной в компьютер через последовательный порт, там тоже выводится вместо числа надпись "inf". Что это такое? Как избавиться от этого "inf"? Переменные Speed, Radius имеют тип volatile float (скорость считается в прерывании INT0), переменные Seconds, LastSeconds имеют тип volatile unsigned long. . Таким образом я считаю скорость Код (C++): Speed=(((2.0*3.1428*Radius)/(Seconds-SecondsLast))*3.6); //скорость в км\ч jj=jj+Speed;// Суммируем все скорости, чтобы потом посчитать среднюю скорость SecondsLast=Seconds; Так я вывожу значение скорости на lcd Код (C++): lcd.setCursor(0,0); lcd.print("Speed:"); lcd.setCursor(12,0); lcd.print("km/h"); lcd.setCursor(6,0); lcd.print(Speed,1); lcd.print(" ");
'inf' означает, что число имеет бесконечное значение. Постоянно увеличивая переменную 'jj' в какой-то момент времени происходит превышение предела для типа 'float' и значение переменной 'jj' становиться равным 'inf' (infinite -- бесконечный). Любая операция с таким числом вернёт также значение 'inf', за исключением NaN -- операции с NaN всегда возвращают значение 'nan'.
AlexU, спасибо за объяснение) Vetrinus, ваш совет не помог. Всё-таки я не до конца понимаю. У меня "inf' появляется, если модель пересекает датчик с большой скоростью, то есть времени между кругами прошло немного, скажем 0,001 секунда. Положим радиус равен 15 м (float Radius=15.0). Получаем по формуле выше значение float Speed=(2*3.1428*15.0*3.6)/(0.001)=339422.2 Переменная типа float может принимать значения в интервале от -3.4028235×10^38 до 3.4028235×10^38, переменная Speed попадает в этот интервал, но почему тогда на экране выводится надпись "inf"? Может быть, я рассуждаю неверно? Подскажите, в чём я ошибаюсь?
Разбейте операцию вычисления скорости на действия, и после каждого действия полученную переменную выводите в последовательный порт. Это поможет вам понять, что происходит в вашей программе.
Ошибка в непонимании того, как представлены числа с плавающей запятой в компьютере: 0.001 - это совсем не 0.001 с точки зрения хранения информации в МК. И вполне вероятен вариант, что при таких малых величинах может случиться банальное деление на 0.
Действительно, у меня получалось деление на ноль. При достаточно быстром пересечении датчика моделью в переменных Seconds и SecondsLast оказывались довольно близкие значения. Разность этих переменных в представлении МК даёт ноль, отсюда и была надпись "inf". Vetrinus, я воспользовался вашим советом и обнаружил свою ошибку. Спасибо всем, кто откликнулся! Проблему считаю решённой!