Вот результаты моих “стараний”
‘’’
/* Вариант получения последней цифры (int), от числа (float) с тремя знаками
после запятой.
Цель такого извращения - получить два самостоятельных числа*/
float p; // Некоторое исходное число
float a; // Промежуточное вспомогательное число
int b; // Второе промежуточное число
int y; // Третья цифра после запятой (нужный результат)
float x; // Число с двумя знаками после запятой (второй нужный результат)
float gx; float sp; // На всякий случай для распечатки (чисто проверить не скрывает ли “сериал порт” третий знак после запятой)
void setup() { Serial.begin(9600); }
void loop() {
p = 2456.238; Serial.print(" p = “); Serial.print(p); // р = 2456,24 Такое выдаёт сериал порт
sp = p * 10; Serial.print(” sp = “);Serial.print(sp); // gp = 24562.38 Подсмотрел третий знак в серийном порту
a = p * 100; Serial.print(” a = “); Serial.print(a); // а = 245623,80 Пока всё гладко
b = a; Serial.print(” b = "); Serial.print(b); // b = 245623 Отличненько
y = (a - b) * 10; Serial.print(" y = “); Serial.print(y); // у = 7!!! А ожидалось быть 8 Хотел его использовать как номер команды или шифр переменной
x = p - (a - b); Serial.print(” x = “); Serial.print(x); // х = 2455,44 Фигня неожиданная
gx = x * 10; Serial.print(” gx = "); Serial.println(gx); //gx = 24554,41 видимо сераил порт нашёл мусорную единичку
delay (20000); //Чтобы не мельтишило в глазах
/* Решить пробдему “в лоб” не получилось. Не думаю, что я первый с такой проблемой. И есть “правильный способ”.
Может кто подскажет как из этого числа (2456.238) добыть целенькую и надёжную восьмёрку? Калькулятором “работал” ESP8266
Как доделаю (если доделаю) устройство - поделюсь результатами*/
}
‘’’
Спасибо большое!
Не понятно почему, но работает ваш код. Я про то, что промежуточные исчbсления превышают возможности int.
Вот мой пример: по Вашему коду
y = 31234.6781000 - int(31234.678100)*10;
Serial.print(" y = "); Serial.println(y);
delay (20000);
Изящно. Мастерство!!!
Не ругайтесь за не правильно вставленый код. Честно признаюсь. Не сумел.
Не нашёл на клавиатуре “обратных кавычек”
Если бы ТС указал тип int16_t, то значения были бы от -32767 до 32768, но просто тип int нигде не документирован. Вполне возможно, что компилятор использовал свой диапазон значений типа int при оптимизации (то есть вычислил значение до помещения в исходный код ардуино), которое в ПК может быть от -2миллиарда+ до 2миллиарда+…
Вообще-то из числа типа float нельзя “достать третью цифру после запятой”. Просто потому, что ее там нет.
Говоря о “третьей цифре”, Вы подразумеваете десятичную запись числа. Так вот именно ее ни в МК, ни в ПК нет. Особенно в формате с плавающей точкой, т.к. он существует исключительно в двоичной системе. А потому при переходе к десятичной происходят всякие преобразования и округления.
Спасибо. Раньше помнил. Забыл.
Пять лет не практиковался.
А теперь возникла необходимость автоматизации закалочной камеры и плавильни алюминия … вот. вспоминаю. Почти закончил.
Термопары освоил. Асинхронного телеграмм-бота тоже.
Асинхронного вайфая домучил. Осталось парочку мелочей в виде надёжного таймера до 150 минут. и отладку.
Вот сегодня, благодаря уважаемому sadman41, написал код для телеграммбота по управлению тремя реле, задачи опорных значений датчиков и выводе всего этого на обратную связь с планшетом и/или мобильником.
Сижу, моргаю светодиодами, щёлкаю релюхами, задаю и считываю показания.
Телеграмм лучше вайфая тем, что "тиликает, при достижении нужных значений.
Хотя Web Server смотрится эффектнее. Ой! Увлёкся. Извините
А вот товарищ sadman41 об этом, видимо, не знал. И предложил надёжную и устойчивую схему. Я уж на неё всяко извращался. И одними девятками и нолями.
Сбоев не обнаружилось.