Первый вариант гарантирует, что в ячейках памяти r1 и r2 будут ОДИНАКОВЫЕ БИТЫ. Но памяти он занимает много.
И в этом варианте после записи r1 в EEPROM r2 уже не запишится (update).
Вопрос. Будет ли содержимое ячеек r1 и r2 совпадать при таком округлении во втором варианте?
Спасибо!
Если r1 уже записано в EEPROM, а r2 отличается от r1 на мизерную величину, то r2 перезапишется в EEPROM. Зачем изнашивать EEPROM лишней записью, если на дисплее я буду видеть одинаковые значения: что r1 округлю, что r2 округлю?
На самом деле есть три варианта округления чисел. А, если мы учитываем и отрицательные числа - еще больше.
Это - если рассматривать только правильные варианты. С неправильными - намного больше.
Вариант с форматным преобразованием (через строку) вряд ли можно считать правильным.
И по поводу приведенного кода.
Я сходу не скажу, что именно делается в первом варианте, но по поводу второго варианта есть сильные подозрения, что вычисления делает компилятор, а не скетч. Т.е. сам скетч вычислений не производит, а потому бессмысленно говорить о его размере.
По моему, если игнорируете “мизерная разность”, то и сравнивайте разность r1 и r2
Если игнорируете при одинаковом отображении, то сравнивайте отображение r1 и r2 (т.е. отформатированный для вывода String)
Т.к. в общем случае, мизерная разность может привести к разному отображению.
Вопрос возник вот в связи с чем.
Мне надо в цикле с датчика BMP180 получать атмосферное давление и фиксировать его минимум и максимум в EEPROM. В первом цикле я могу увидеть, например, 735.7 мм рт. ст. (после первода дюймов рт. ст. в мм рт. ст. и округления), и во втором цикле увидеть то же самое. Но значения переменной, из которой я получаю давление в первом и втором циклах могут при этом отличатся. При этом может произойти лишняя запись в EEPROM.
Во-первых, проведите тест, который я вам написал в #8
А во-вторых, как я уже указывал выше - лучше вообще избавлятся от флоат и работать с целыми. Если вам нужны десятые в цифре давления - домножьте его на 10, если сотые - на сто.
Полученное целое храните в ЕЕПРОМ, а перед выводом на экран просто поделите на 10 или 100 снова.
Заодно и профит - давление с десятыми в виде целого влезет в uint16 и будет занимать только две ячейки ЕЕПРОМ, в отличии от флоат, которое требует четырех.
но это только потому, что не уверен, как работает trunс()
В этом коде результат всегда будет одинаков, если числа совпадают до 4 знака после запятой 3 знака
И еще вопрос не по теме. Производитель Arduino-UNO гарантирует 100 000 записей в EEPROM.
Каждый байт выдерживает 100 000 перезаписей или 100 000 обращений вообще???
100тыс это только гарантированный минимум, на практике народ запускал тесты и ЕЕПРОМ выдерживала миллионы перезаписей.
Если вам нужно больше, используйте память FRAM - там число перезаписей достигает 10 в 14 степени. Модули фрам недорогие есть на Али
Ну так проведите численный эксперимент. Хотя бы на миллионе случайных чисел.
А вообще, со случайными - не нужно.
Переберите весь список значений, которые можно получить с датчика.
Например, с аналогового входа можно получить числа от 0 до 1023 с шагом в единицу. Всего 1024 числа. С любым датчиком, думаю, аналогично. Вряд ли датчик может выдать больше 65536 разных значений. Значит, достаточно проверить на всех этих значениях, и у Вас будет исчерпывающий ответ на Ваш вопрос.