Разбор float по символьно
- Войдите на сайт для отправки комментариев
Пт, 01/09/2017 - 21:49
Есть переменная с типом float, в которой например хранится значение 3.03. Как можно разбить это значение, чтобы вывести его потом на 7-ми сегментный индикатор? Т.е на 3, 0, 3 в отдельном массиве или переменных
http://geekmatic.in.ua/arduino_otobrazhenie_dannyih_float
Ещё как вариант разбить через modf() на целую и дробную части
Первый вариант имхо для меня идеальный. А с modf() мне кажется потом будет еще геморрой дробную часть разбирать под удобный мне формат
UPD: вариант с dtostrf отлетает, скетч потом в МК не помещается(пишу под tiny13)
Apocalyps, для tiny13 вообще нет смысла использовать float. Всегда есть варианты обхода с целочисленной арифметикой.
Apocalyps, для tiny13 вообще нет смысла использовать float. Всегда есть варианты обхода с целочисленной арифметикой.
подскажите пожалуйста, а то не могу сообразить
float - число с плавающей точкой, состоит из мантиссы и порядка. AVR аппаратно не поддерживается.
dimax предлагает вместно них использовать числа с фиксированной точкой. Реализуются посредством целочисленной арифметики, поддерживаемой аппаратно.
А мне всегда казалось, что целые это всегда без точки. Если заранее использовать целые числа, скажем в 100 раз больше реальных, и помнить об этом. Потом легче разбить целое на цифры и вывести на индикатор. Поставив точку в нужной позиции увидим float. И память подпрограммами плавающей арифметики не будет забиваться.
типа 3.03*5.55 = 303*555/100 - быстрее посчитает и памяти меньше займёт.
Только на 10000 делить надо в посследнем случае. Ну ты понел.
Чтобы два десятичных знака осталось надо делить на 100. Если разделить на 10000 то десятичные знаки будут нули. Еще на 100 поделится, когда десятичной точкой два знака отделим.
Да
Ну можна и на 100 делить, но вощето -
Числа с фиксированной точкой.
Форма записи числа с фиксированной точкой использовалась в основном на ранних этапах развития вычислительной техники. Запись числа с фиксированной точкой обычно имеет знаковый и цифровой разряды. Фиксированная точка означает, что на этапе конструирования ЭВМ было определено, сколько и какие разряды машинного слова отведены под изображение целой и дробной частей числа. Запятая в разрядной сетке может быть зафиксирована, в принципе, после любого разряда.
Пример.
Ячейка с целой и дробной частью.
http://www.edu.sbor.net/mars/info/prof/m_mater/mat/teoria2/3.html
Только положение точки Вы сами себе выбираете как удобней а не при конструировании ЭВМ. например ваше 3,03 в формате как на картинке будет 00000011.00001000 точней это будет 3,03125. Ошибка округления. Как персчитывать? - Ну с целой понятно думаю, а дробную часть будем считать как целое умноженое на 2^-n. В примере дробная 00001000 в десятичной форме просто целое 8 и имеем 8*1/256=0,03125.
Зачем все эти сложности? А за тем, что матоперации с такой формой записи числа ничем не отличаются от операций с целыми. Работают быстро. От програмиста требуется только помнить где заканчивается целая часть числа и начинается дробная.
А мне всегда казалось, что целые это всегда без точки. Если заранее использовать целые числа, скажем в 100 раз больше реальных, и помнить об этом. Потом легче разбить целое на цифры и вывести на индикатор. Поставив точку в нужной позиции увидим float.
Будет не float, а fixed.
В языке СИ нет такого типа fixed. На дисплее будет int, который будет выглядеть как float.
В языке СИ нет такого типа fixed. На дисплее будет int, который будет выглядеть как float.
Похоже до "ардуинщиков" не дошла весть о появлении Си++ Ведь в Си++ можно изобретать разные переменные. Комплексных тоже вроде встроеных нет. Но нормально работают.
Не ну нравятся мне отдельные персоонажи. Тип выдумают, отсутствующий в стандарте, только бы не признать, что не правы. В с# есть оператор fixed. Но к типам это не имеет отношения.
nik182, при чем здесь вообще Ардуино и Си? Речь идет о способах представления чисел, и от языков программирования это никак не зависит. Хотя бы потому, что языки программирования вторичны по отношению к способам представления чисел. Так что не нужно уводить разговор в сторону, деже если Вам очень не хочется признавать, что Вы написали о float, не подумав.
И, кстати, если уж на то пошло, на дисплее будет строка, являющаяся символьным представления числа с фиксированной точкой.
Да да, конечно. Именно строка символов, представляющаяя число с десятичной дробной частью. Эквивалентная представлению типа float с фиксированным количеством знаков после десятичного разделителя, который хотел видеть на экране ТС. Получить строку для представления можно разными способами. Один из них это использование арифметики fixed point. Но даже сделав все вычисления целочисленными fixed point в конце вы получае не целое а действительное число с фиксированным количеством десятичных знаков, которому соответствует тип float. Если вы выведете полученное значение fixed point без дополнительных телодвижений вы получите число без десятичной точки. Потому что оно целое и десятичные знаки существуют только в вашем воображении в количестве, заданном перед началом вычислений. Т.е в конце из целого fixed надо представить float, которое целый fixed подразумевает. Тут конечно можно долго спорить есть точка в fixed или нет. С точки зрения целочисленности или с т.з. виртуального представления.
Если правильно понял, то надо преобразовать float в строчку. С этим действительно есть проблема. Вот когда-то написал такую функцию, вроде работала:
Но даже сделав все вычисления целочисленными fixed point в конце вы получае не целое а действительное число с фиксированным количеством десятичных знаков, которому соответствует тип float.
Отнюдь.
Fixed тем и отличается от float, что у первого фиксированное количество дробных знаков, а у второго - фиксированное общее количество знаков (как правило, двоичных, а не десятичных).
Если вы выведете полученное значение fixed point без дополнительных телодвижений вы получите число без десятичной точки.
Мне как-то даже неудобно напоминать, что если Вы используете свой тип даннх, то и для его вывода на печать следует писать свой код. Неужели это кому-то не очевидно?
Т.е в конце из целого fixed надо представить float, которое целый fixed подразумевает.
Еще раз: с чего Вы предположили, что fixed подразумевает float?
Тут конечно можно долго спорить есть точка в fixed или нет.
У Вас есть сомнения по поводу того, есть ли в типе данных с названием "fixed point" точка?
Похоже, мы с Вами существуем в различных Вселенных...
Действительно в разных вселенных. В моей примером fixed point можно привести подсчёты рублей выражая их через копейки и считая копейки, всегда иметь рубли с точностью до двух десячичных знаков после запятой. Но числа которыми мы будем при этом оперировать всегда целые.
Ну, вариант с рублями и копейками, он нагляден, но все-таки это не совсем fixed point, т.к. fixed point подразумевает дробные числа, а копейки - всегда целые (рубли - те же копейки, но с масштабным множителем).
Кроме того, fixed point обычно использует двоичную систему счисления, а число знаков после точки определяется максимально эффективным использованием разрядной сетки. Ну, например, если нам нужно измерять длины до 10 м, то разумно 4 разряда отвести под целые, а оставшиеся 4(12) в 8(16)-разрядном числе - под дробную часть. Тогда единица младшего разряда составит 62.5(0.24)мм.
И еще: вопрос вывода чисел fixed point в строку (на экран, на принтер...) к самому представлению отношения не имеет, а при необходимости рассматривается последним - когда все прочие характеристики уже определены.
Да какая разница. Двоичные, десятичные, важен принцип. Обработка одного числа, без деления на мантиссу и порядок.
Да какая разница. Двоичные, десятичные, важен принцип. Обработка одного числа, без деления на мантиссу и порядок.
Основной принцип отражен в названии - число с фиксированной точкой. Т.е. целая и дробная части имеют фиксированную длину. Как обрабатывать - вопрос отдельный. Десятичные обрабатывать на двоичной машине невозможно - только на двоично-десятичной (или десятичной, если такая экзотика где встретится) И, кстати, мантисса и порядок - это тоже одно число. И, соответственно, обрабатывать тоже можно по-разному.
Ещё как вариант разбить через modf() на целую и дробную части
Спасибо!
Правда сперва не понял как работает, но потом сколхозил такое для вывода температуры с точностью до сотых:
потом сколхозил такое для вывода температуры с точностью до сотых:
Ты действительно можешь шкурой отличить +5 от +5.15°С ?