.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 является правильным значением, поэтому в идеале я бы хотел, чтобы значение с плавающей точкой было одинаковым.

, 👍1

Обсуждение

Поплавок-это только приближение. Это настолько близко, насколько это возможно., @Majenko

Есть ли вообще возможность подобраться поближе? Даже .ToDouble() дает тот же результат, @William Smith

На Arduino нет двойника. Все это плывет., @Majenko

Я бы посоветовал не работать ни в какой форме с плавающей запятой. Вместо этого работайте в неподвижной точке. Используйте long и используйте значение x 1000000 или что-то в этом роде., @Majenko

Хранить 51.507401 градусов как` 51507401 ' микроградусов, @Majenko

Спасибо! Думаю, я так и сделаю!, @William Smith


1 ответ


2

Похоже, метод toFloat() немного неаккуратен в своем преобразовании. Float, ближайший к 51.507401, равен 51.5074005126953125, что составляет всего 0,13 промедления. Число, которое вы получили, находится прямо перед ним, а именно 51.507396697998046875, что составляет 1,13 пункта. Увы, функции avr-libc atof() и strtod() допускают ту же ошибку.

Я бы предложил сначала рассмотреть, действительно ли ошибка существенна для вашего приложения: она составляет всего около 48 см на поверхности Земли. Если этот уровень точности имеет для вас значение, то следуйте предложению Майенко и используйте целое число микрогреев.

,