Пиво тому, кто поможет сохранить число (45.783266) в eeprom, а потом его вызвать в переменную!

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем evganiy32, 15 апр 2019.

  1. evganiy32

    evganiy32 Нуб

    Ситуация такая. Мне надо сохранить координаты GPS в eeprom, а потом загрузить их в переменную, для скормления библиотеки TinyGPS для указания целевой точки GPS. Чтобы робот мог запоминать координаты, а потом в них возвращаться.
    Проблема в том, что float такого числа, (когда есть две цифры до запятой) имеет точность всего 5 цифр после запятой, т.е. число 45.78326 легко запоминается и вызывается, а вот если добавить еще одну цифру после (разрядность), то получается ерунда... Также не работают законы математики с такими числами. Например 45.783266+0,000001 не равно 45.783267...
    Либо помогите поправить библиотеку, чтобы можно было задавать целевую широту и долготу целыми числами...
     
  2. DetSimen

    DetSimen Спамовредитель Модератор

    считай тогда и храни в BCD

    вапще, прочитай чонить про вычисления с фиксированной точкой. да прикрути к AVR
     
    Последнее редактирование модератором: 15 апр 2019
    Daniil нравится это.
  3. А какие переменные принимает библиотека tinygps?
     
  4. DetSimen

    DetSimen Спамовредитель Модератор

    да, думаю, такие же (тот же дубовый float).
     
  5. А можно не думать, а знать, может быть?
     
  6. DetSimen

    DetSimen Спамовредитель Модератор

    ну лана, думать больше не буду, раз низзя.
     
  7. evganiy32

    evganiy32 Нуб

    видимо не все понимают суть проблемы.
    Если на ардуине посчитать пример 45.783266+0,000001 = 45.783264
    Если на ардуине сохранить в eeprom 45.783266, то при вызове получим другое число (45.783267)
    Любая операция с числом 45.783266 приводит к его изменению!
     
  8. b707

    b707 Гуру

    Интересно, 45.783266 - это широта или долгота?
    Если широта, то ошибка 0.000001 = 11 см
    А если долгота - то 8 см
    Ни один бытовой GPS не дает точности определения коррдинат даже в 1 метр, так что сохранять шестую цифру в ЕЕПРОМ нет ни малейшего смысла, там пятая-то не всегда нужна...
     
  9.  
  10. b707

    b707 Гуру

    математически суть проблемы вполне понятна. И решение ее очень простое -написать свое собственное представление класса флоат. Например, храннить целую часть как int, а вещественную - как long

    Только на практике это не нужно
     
    Daniil нравится это.
  11. evganiy32

    evganiy32 Нуб

    double LONDON_LAT = 51.508131;
    double LONDON_LON = -0.128002;
    double distanceToLondon = TinyGPSPlus::distanceBetween(gps.location.lat(),gps.location.lng(),LONDON_LAT, LONDON_LON);

    Библиотека tinygps как-то оперирует с такими числами, т.к. (к примеру) gps.location.lat()=45.783266;
     
  12. DetSimen

    DetSimen Спамовредитель Модератор

    на восьмибитках double==float.
     
  13. b707

    b707 Гуру

    а вы в компьютерах - совсем ни бум-бум? что такое double - не в курсе? - откройте гугль и почитайте.
    Проблема в том, что на ардуине нет double.
    Так что остается либо написать его самостоятельно, либо смирится с точностью только в пять цифр после запятой.
     
  14. evganiy32

    evganiy32 Нуб

    А вот это дельная мысль! Сейчас проверю!

    Что значит нет? Есть, только в ардуине double=float! Просто привел пример из скетча. Я ведь задавал вопрос про float!

    Видимо проблему обойти не смогу, буду использовать 5 цифр

    Я пробовал так делать - проблема возникает при сборке числа. Итоговое число всегда отличается от частей...
     
    Последнее редактирование модератором: 15 апр 2019
  15. Замечательно. Теперь следующий вопрос: зачем вам хранить данные в большем разрешении, чем принимает библиотека?
     
  16. Daniil

    Daniil Гуру

    это как с корнем кубическим из минус единицы. ((-1)^(1/3)) Кто-то скажет, что ответ -1, а кто-то 0.5+0.8660254038i. Надо разобраться как работает используемый инструмент и необходимость такой точности.
    Если такая точность необходима, то нужно писать свою собственную реализацию чисел с плавающей зпт. Но! Придется и переписывать библиотеку, т.к. уверен, что она не будет с самописной реализацией вашего типа.
    Даже если удасться записать ваше число в еепром, то в функцию всё равно будет уходить "округленное" число
     
  17. evganiy32

    evganiy32 Нуб

    Почему в большем? Библиотека как раз понимает 6 разрядов, только не понимаю как ))
    Либо 6 разряд в широте и долготе она выводит "от балды" ))
     
  18. Хорошо, давайте еще раз посмотрим внимательно на то, какой тип принимает библиотека.
     
  19. evganiy32

    evganiy32 Нуб

    Вы действительно правы! 6 разряд необязателен.
    Т.к. вы первый помогли решить мою проблему, как я и обещал, с меня пиво! :) Присылайте в личку куда скинуть денюшку!

    Всем спасибо за помощь в решении проблемы!
     
  20. b707

    b707 Гуру

    пожалуйста!
    Денег не надо - не за что. Вот если вам действительно нужно будет хранить такое число в ЕЕПРОМ - обращайтесь :)