Функция map() точность вывода значений

Всем доброго дня.

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

Решил сравнить скорость работы функции map() и простого вычисления. На картинке строки 14 и 15. Простое вычисление получается быстрее. При этом заметил что map() не выводит значение после запятой. Первые четыре строки в Мониторе порта. Если поставить в Serial.print(sensorValue,1); количество цифр после запятой, к примеру четыре, будет выводить четыре 0. Но если закомментировать строку 14 и раскомментировать строку 15 , оставив простое вычисление, то знаки после запятой показывает как должно быть. Строка 2 объявление переменной не меняется.

она оперирует целыми
сделайте свою и используйте

float map_float(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

@xDriver , опередил ))
Хотел спросить у ТС: О какой точности после запятой может идти речь у целых чисел?))

Спасибо ответившим.

Прежде чем спрашивать на форуме надо было в гугел зайти.

Основные особенности:

  • Работает только с целыми числами; дробная часть при вычислениях отбрасывается, а не округляется по математическим правилам

Зачем гугель?
Заголовок функции надо смотреть:

long map(long x, long in_min, long in_max, long out_min, long out_max)

и сразу все ясно - возвращаемое значение - целое.

А в гугле мало ли что напишут…

А зачем для сенсора (AnalogRead) double переменная? Вещественное число 64 бит если AnalogRead возвращает int

10 или 12 бит значение (ардуина/есп)

В Arduino что double, что float - одинаково

удалил, глупость написал

Некорректное сравнение: Вы сравниваете результат выполнения функции, производящей 6 арифметических операций с выражением, содержащим единственную математическую операцию с использованием заранее вычисленной константы.
Кстати, самая продолжительная операция в map - это целочисленное деление, она одна выполняется дольше, чем любая арифметическая операция с плавающей точкой. И еще: типы double и float для AVR одинаковы.
В общем, внимательнее следите за типами, участвующими в выражении и имейте в виду, что время выполнения различных арифметических операций соотносится примерно так:

  1. Быстрее всего - целочисленные сложение, вычитание и умножение.
  2. Заметно медленнее - операции с плавающей точкой.
  3. Медленнее всего - целочисленное деление чисел типа long int.

А как дела обстоят у esp32, esp32s3? Есть такая информация?

Гайвер старался, людей нанимал! Уж звиняйте за устаревшие сервера.

нельзя сравнивать несравнимое, ESP32S3 делает STM32F4 в целочисленной арифметике почти на порядок, вот к примеру я измеряю напряжение, ну скажи нахрена его держать во float, умножай на тысячу и держи в милливольтах, два байта экономии, а так как нужны вообще-то % переводим в 0-100 и одного байта достаточно )))

Учитывая, что аналогрид считывает далеко не во флоат и стм нигде не упоминалась, то в принципе всё норм. А с умножением на тыщу и проценты - согласен. Удобненько :slightly_smiling_face:

так уж и нигде )))

Мкей, побуду :t_rex: ..Хм-хм. Хотяяя, да вы совершенно правы! Молодцом! Ведь Esp32 и esp32s3 абсолютно идентичные вещи. Да и стм первой и четвёртой серии тоже копии!

У него это болезнь, была тема гдеон NRF-ки разные под одну гребенку согнал, ниче прокатывает.

STM тоже не уточнялась )))

Микроконтроллер	Архитектура / FPU	Сложение (+)	Умножение (*)	Деление (/)
ESP32-S3 (240 МГц)	Xtensa LX7 / есть	~0.94 мс	~0.11 мс	~0.13 мс
STM32F405 (168 МГц)	Cortex-M4 / есть	~7.9 мс	~7.9 мс	~8.1 мс
ESP32 (ESP-WROOM-32) (160 МГц)	Xtensa LX6 / есть	~6.8 мс	~7.2 мс	~7.5 мс
RP2040W (125 МГц)	Cortex-M0+ / нет	~12898 мс	~13069 мс	~13236 мс

PS в любом случае даже старенький ESP32 немного получше в целочисленной

Вооо
И “порядки” тут свои (видимо как в ДВС), ребят, ну с кем вы связываетесь.

Ну ты же имел, свойственное тебе, сделать ПУК :face_with_medical_mask:
Чего теперь оправдываешся?

А кто Вам мешает самостоятельно измерить?

Можно чем-то подтвердить это высказывание?
ESP32 не гонял, а ESP8266 чуть быстрее (в расчете на такт) выполняет сложение, вычитание и умножение - процентов на 20, зато деление - медленнее в 12 раз. А, учитывая, что деление сама по себе медленная операция, ESP не выигрывает, а, наоборот, проигрывает STM32F4 примерно в 10 раз, т.е. на порядок.
Это, повторюсь, в расчете на такт, в абсолютных единицах ESP8266 проигрывает STM32F407 уже раз в 30.

Только небольшое замечание: 32-разрядные процессоры оперируют с 8- и 16-разрядными числами медленнее, чем с 32-разрядными.
И потом - откуда взялись 1000 или 100? Удобнее всего хранить в естественных единицах - т.е. тех, которые отдает датчик.

Отнюдь.
У них и настройка периферии выполняется по-разному (у F4 - намного логичнее), и время выпjлнения в тактах различается (F4 ощутимо быстрее, чем F1).

Так это для плавающей точки, хотя речь шла о:

Что же касается плавающей точки, у меня сложилось впечатление, что компилятор просто не в курсе, что у STM32F4 может быть FPU, поэтому он все делает на целочисленных командах.