Float в String без лишнего мусора

Sakolua
Offline
Зарегистрирован: 13.08.2019

Пытаюсь вывести float, используя допустим String(t,1) и получается как то странно при некоторых значениях... не по человечески чтоли:

-0.0

0.0
Вот как можно вывести обычным видом, если 0 то 0. Если 0.000001 то все равно 0, а не 0.0. И так же если -0,0001 то 0, а не -0... и не -0.0

dtostrf делает строку фиксированной длины, что не нужно.

b707
Offline
Зарегистрирован: 26.05.2017

ну если ты задал точность один знак после запятой - то и должно быть 0.0, а не просто 0

А недоволен - то пиши свою функцию с округлением через целый тип

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А можно поточнее (желательно, поформальнее) сформулировать что такое "обычный вид". А то у Вас 0.000001 должно быть 0, А, скажем, 0.00001? А 0.0001? А 0.1? Как-то неопределённо всё.

Да и про dtostrf не понял в чём Ваша проблема? Нормально она всё преобразует. Что не так?

Sakolua
Offline
Зарегистрирован: 13.08.2019

Хотя б как сделать чтобы 0 не быль негативным -0.0, ну это же полная чушь

Sakolua
Offline
Зарегистрирован: 13.08.2019

Почему в этом примере все у автора рабоает?
https://arduinobasics.blogspot.com/2019/05/sprintf-function.html
А у меня вместо float только "?" везде?

b707
Offline
Зарегистрирован: 26.05.2017

Sakolua пишет:

Почему в этом примере все у автора рабоает?
https://arduinobasics.blogspot.com/2019/05/sprintf-function.html
А у меня вместо float только "?" везде?

он же там предупреждает, что код будет работать только на ЕСП. вроде

На Ардуино sprintf с float не работает

Sakolua
Offline
Зарегистрирован: 13.08.2019

А вот так
https://forum.arduino.cc/index.php?topic=344206.new#new
кто-нибудь делал? (в конце)

b707
Offline
Зарегистрирован: 26.05.2017

ну наверно делал, раз тема такая есть.

Только имейте в виду - на Ардуино нет printf не потому. что кто-то забыл его туда добавить, а потому что у микроконтроллера нет аппаратной поддержки типа float.  Любое использование вычислений с плавающей точкой, в том числе и вывод этого типа на печать - весьма и весьма раздувает код.

Значительно эффективнее не использовать printf, а написать вывод чисел с плавающей точкой самому через целые числа.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Да мне кажется, если уж «0.00001» должно выводиться как «0», то это ближе к явному приведению типа к целочисленному. Я на сторонние ссылки не хожу, может и не понял чего. 
А вообще, что за устройство и зачем так делать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sakolua пишет:

Хотя б как сделать чтобы 0 не быль негативным -0.0, ну это же полная чушь

Я просил Вас дать строгое определение, а не "хотя б".

Кроме того, я Вас спрашивал, что не так с dtostrf?

Ни на один вопрос я ответа не получил. Правильно ли я понимаю, что Вам не нужна помощь? Ну, тогда извините.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sakolua пишет:

Почему в этом примере все у автора рабоает?
https://arduinobasics.blogspot.com/2019/05/sprintf-function.html
А у меня вместо float только "?" везде?

А Вы читали, что автор пишет?

"I seemed to get this to work fine on an ESP32, but on an Arduino, the float, scientific and big number sections were a bit hit and miss"

Что это по-Вашему значит?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

На Ардуино sprintf с float не работает

Кто сказал, что не работает?

На ВСЕХ 32-разрядных (Due, stm32...) работает.

b707 пишет:

...потому что у микроконтроллера нет аппаратной поддержки типа float.

Отнюдь. 

Ни у Due, ни у stm32f1xx тоже нет аппаратной поддержки, однако же - работает.

Не работает потому, что в Си типом по умолчанию является double, только в 8-разрядных Ардуинах double имеет 32 разряда, а sprintf ожидает, что в double - 64.

Sakolua
Offline
Зарегистрирован: 13.08.2019

BOOM пишет:

если уж «0.00001» должно выводиться как «0», то это ближе к явному приведению типа к целочисленному
А вообще, что за устройство и зачем так делать?


обычный вывод нецелого числа с одним знаком после запятой 0.0 не думал, что для этого нужно объяснительную. писать )))) они же вокруг нас! Например, не будешь же температуру выводить как 25.98

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
Sakolua
Offline
Зарегистрирован: 13.08.2019

по кругу ходим... и я получаю фигню вроде -0.0
и вопрос был как этого избежать

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
if (abs(temp)<0.1) print(int(temp));
else printf(dstrtof(..,1,..);

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А вапще, температуру выводить всегда надо в целых (я всегда так делаю).  Как то пофиг, -34 градуса на улице, или -34.25.

IMHO

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sakolua пишет:
по кругу ходим...
И будем ходить пока всем не надоест или Вы не начнёте отвечать на вопросы, которые Вам задают.

SLKH
Offline
Зарегистрирован: 17.08.2015

Sakolua пишет:
BOOM пишет:

если уж «0.00001» должно выводиться как «0», то это ближе к явному приведению типа к целочисленному
А вообще, что за устройство и зачем так делать?

обычный вывод нецелого числа с одним знаком после запятой 0.0 не думал, что для этого нужно объяснительную. писать )))) они же вокруг нас! Например, не будешь же температуру выводить как 25.98

Не скажи. У нас тут недавно рыбу варили с невероятной точностью.

astwo
Offline
Зарегистрирован: 10.07.2019

SLKH пишет:

Не скажи. У нас тут недавно рыбу варили с невероятной точностью.


Надо ещё и давление показывать при варке рыбы. При низком давлении рыбу можно вообще не сварить.

Sakolua
Offline
Зарегистрирован: 13.08.2019

DetSimen пишет:

if (abs(temp)<0.1) print(int(temp));
else printf(dstrtof(..,1,..);

 

а что значит .. ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Другие, пропущенные параметры

Sakolua
Offline
Зарегистрирован: 13.08.2019

Эх, если уж самому писать...
Скажите, а почему "-" не равно '-'?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Потому что один char *, а второй char.  Смекаешь?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ты мне ответь, тебе правда не пофик, 10 градусов на улице, или 10.2?

Sakolua
Offline
Зарегистрирован: 13.08.2019

Смекаешь?

не очень... (
Температура чисто для примера, у меня другой параметр.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну тогда для начала дуй в гугал и накрепко изучи строки Си

b707
Offline
Зарегистрирован: 26.05.2017

блин, Sakolua, ну сколько можно воду в ступе толочь?

Если надо выести на печать число 31.54289 с двумя знаками после запятой - делай так:

float ff = 31.54289;
unt dd = ff * 100;
// целая часть числа
int d1 = dd/100;
// дробная часть
int d2 = dd%100;
// выводим на печать целую и дробную часть, разделяя точкой
Serial.prunt(d1);
Serial.prunt(".");
Serial.prunt(d2);

напечатает

31.54

и никакой printf не нужен

Sakolua
Offline
Зарегистрирован: 13.08.2019

Не знаю какую ты там воду толочишь, а я такого не спрашивал. Два знака и так без проблем делается по умолчанию системой вообще без настроек.

b707
Offline
Зарегистрирован: 26.05.2017

Sakolua пишет:

Два знака и так без проблем делается по умолчанию системой вообще без настроек.

ну так и чего ты тупишь второй день?

Sakolua
Offline
Зарегистрирован: 13.08.2019

Это ты тупишь, иди и почитай первый пост.

Sakolua
Offline
Зарегистрирован: 13.08.2019

А вообще я уже сам все сделал,  так что можешь больше не переживать со своей ступой.

svm
Offline
Зарегистрирован: 06.11.2016

Sakolua пишет:

А вообще я уже сам все сделал,  так что можешь больше не переживать со своей ступой.

Ну похвались. Выложи скетч.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

блин, Sakolua, ну сколько можно воду в ступе толочь?

всю жизнь и не можно, а нужно )))

b707
Offline
Зарегистрирован: 26.05.2017

Sakolua пишет:

А вообще я уже сам все сделал,  так что можешь больше не переживать со своей ступой.

очень интересно, что ж ты там такое наваял? особенно с учетом вопроса о разнице char и char* :))))

svm
Offline
Зарегистрирован: 06.11.2016

Финские учёные разгадали секрет спецэффектов фильма "Матрица"... стреляли из финских пистолетов.

Хотя может быть я ошибаюсь, и ТС вовсе  не Финн?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

блин, Sakolua, ну сколько можно воду в ступе толочь?

Если надо выести на печать число 31.54289 с двумя знаками после запятой - делай так:

float ff = 31.54289;
unt dd = ff * 100;
// целая часть числа
int d1 = dd/100;
// дробная часть
int d2 = dd%100;
// выводим на печать целую и дробную часть, разделяя точкой
Serial.prunt(d1);
Serial.prunt(".");
Serial.prunt(d2);

напечатает

31.54

и никакой printf не нужен

сдаётся мне что это не прокатит - unt dd = ff * 100;

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

сдаётся мне что это не прокатит - unt dd = ff * 100;

это защита от бездумной копипасты

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

сдаётся мне что это не прокатит - unt dd = ff * 100;

это защита от бездумной копипасты

в смысле?
Дед как-то подсказывал по краткой записи беззнакового, никак не запомню

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

 uint16_t или uint32_t

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

 uint16_t или uint32_t

это я знаю, думал еще короче )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

word и dword. Короче?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

SLKH пишет:

Sakolua пишет:
BOOM пишет:

если уж «0.00001» должно выводиться как «0», то это ближе к явному приведению типа к целочисленному
А вообще, что за устройство и зачем так делать?

обычный вывод нецелого числа с одним знаком после запятой 0.0 не думал, что для этого нужно объяснительную. писать )))) они же вокруг нас! Например, не будешь же температуру выводить как 25.98

Не скажи. У нас тут недавно рыбу варили с невероятной точностью.

буквально сегодня клиенту вернул десятичные доли градуса в показаниях СМС, за вопрос зачем - так удобнее видеть не -00, -00.5

хотя да, практической пользы нет.

Serg1958
Offline
Зарегистрирован: 19.03.2020

b707 пишет:

блин, Sakolua, ну сколько можно воду в ступе толочь?

Если надо выести на печать число 31.54289 с двумя знаками после запятой - делай так:

float ff = 31.54289;
unt dd = ff * 100;
// целая часть числа
int d1 = dd/100;
// дробная часть
int d2 = dd%100;
// выводим на печать целую и дробную часть, разделяя точкой
Serial.prunt(d1);
Serial.prunt(".");
Serial.prunt(d2);

напечатает

31.54

и никакой printf не нужен

На счёт проблем, что напечатает если float ff = -0.55 ? 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Serg1958 пишет:

b707 пишет:

блин, Sakolua, ну сколько можно воду в ступе толочь?

Если надо выести на печать число 31.54289 с двумя знаками после запятой - делай так:

float ff = 31.54289;
unt dd = ff * 100;
// целая часть числа
int d1 = dd/100;
// дробная часть
int d2 = dd%100;
// выводим на печать целую и дробную часть, разделяя точкой
Serial.prunt(d1);
Serial.prunt(".");
Serial.prunt(d2);

напечатает

31.54

и никакой printf не нужен

На счёт проблем, что напечатает если float ff = -0.55 ? 

Это уже мелочи. Может там и не будет отрицательных чисел. А если будет, то достаточно добавить две строки

float ff = 31.54289;
int dd = ff * 100;
// целая часть числа
int d1 = dd/100;
if (dd < 0 && d1 == 0)
  Serial.print("-");
// дробная часть
int d2 = dd%100;
// выводим на печать целую и дробную часть, разделяя точкой
Serial.prunt(d1);
Serial.prunt(".");
Serial.prunt(d2);

 

Serg1958
Offline
Зарегистрирован: 19.03.2020

d2 тоже имеет знак, поэтому перед выдачей нужно d2=abs(d2);

b707
Offline
Зарегистрирован: 26.05.2017

Serg1958 пишет:

d2 тоже имеет знак, поэтому перед выдачей нужно d2=abs(d2);

Я не понял, вы заказчик. чтобы требовать тут безошибочного исполнения ТЗ?

Главнаой идеей моего поста был вовсе не код. а то что ТС тупень и спрашивает элементарные вещи :)

Serg1958
Offline
Зарегистрирован: 19.03.2020

Требований не было! Многие для экономии ресурсов котроллера не используют printf(float), а используют аналогичные методы. Идея не нова. Не знаю кто такой "ТС тупень", но можно и повежливей.

b707
Offline
Зарегистрирован: 26.05.2017

Serg1958 пишет:

 Многие для экономии ресурсов котроллера не используют printf(float), а используют аналогичные методы. Идея не нова.

вы не правы, моя идея настолько свежа и оригинальна, что заслуживает нобелевки!

Если Тс - тупень, то вы - зануда :)))

Надо быть проще, бро.

 

Serg1958
Offline
Зарегистрирован: 19.03.2020

Конечно брю!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Поддерживаю, бра! ))))