.toFloat() дает неправильные ответы
Я передаю плавающее фиксированное значение по радио HC-12, которое затем принимается другим радио HC-12. Затем я пытаюсь преобразовать эту строку в значение с плавающей запятой, для которого требуется 6 знаков после запятой. Однако, когда я распечатываю строковое значение, а затем значение с плавающей точкой, я получаю два разных ответа.
Код:
String lat=getValue(_msg, '|', 6); // Функция для получения значения lat из входящего сообщения
Serial.println(lat);
Serial.println(lat.toFloat(), 6);
Затем это приводит к отображению пользователю следующих значений:
51.507401
51.507396
Значение 51.507401 является правильным значением, поэтому в идеале я бы хотел, чтобы значение с плавающей точкой было одинаковым.
@William Smith, 👍1
Обсуждение1 ответ
Похоже,
метод toFloat() немного неаккуратен в своем преобразовании.
Float, ближайший к 51.507401, равен 51.5074005126953125, что составляет всего
0,13 промедления. Число, которое вы получили, находится прямо перед ним,
а именно 51.507396697998046875, что составляет 1,13 пункта. Увы, функции
avr-libc atof()
и strtod()
допускают ту же ошибку.
Я бы предложил сначала рассмотреть, действительно ли ошибка существенна для вашего приложения: она составляет всего около 48 см на поверхности Земли. Если этот уровень точности имеет для вас значение, то следуйте предложению Майенко и используйте целое число микрогреев.
- Преобразование числа с плавающей запятой в шестнадцатеричное значение
- Преобразовать string во float на ардуино
- Хранение значений широты и долготы в виде символов с заданной точностью
- Включить полную библиотеку snprintf() с плавающей точкой с помощью PlatformIO
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- Float печатается только 2 десятичных знака после запятой
- Отправка и получение различных типов данных через I2C в Arduino
Поплавок-это только приближение. Это настолько близко, насколько это возможно., @Majenko
Есть ли вообще возможность подобраться поближе? Даже .ToDouble() дает тот же результат, @William Smith
На Arduino нет двойника. Все это плывет., @Majenko
Я бы посоветовал не работать ни в какой форме с плавающей запятой. Вместо этого работайте в неподвижной точке. Используйте
long
и используйте значение x 1000000 или что-то в этом роде., @MajenkoХранить
51.507401
градусов как` 51507401 ' микроградусов, @MajenkoСпасибо! Думаю, я так и сделаю!, @William Smith