float? Количество знаков целой и дробной частей XXXXXXX.xxxxxx
- Войдите на сайт для отправки комментариев
Ср, 21/10/2020 - 00:27
Доброго времени суток!
При
float J = 2451545 + 0.0009 + (27.560858/360) + 7598 = 2459143.0000000
но разделив на 10:
float J = (2451545 + 0.0009 + (27.560858/360) + 7598)/10 = получаю 245914.2968750
Как в первом случае получить адекватную мантиссу?
Юлианская дата - необходимо получить 2459142.968750
Спасибо!
P.S. Хотелось бы без компромиссов!
никак.
float с одинарной точностью не предназначен для точных вычислений, а double в ардуине нет. Во флоат в ардуино всего 6-7 значащих цифр. Это означает, что если у вас до запятой 6 цифр - то дробная часть не будет точной даже на уровне первого знака после запятой
Используйте целые числа. Особенно для дат...
2.5 миллиона дней?
"да вы оптимист. батенька..." :))))
Я не знаю, зачем вам 2.5 миллиона дней, но для обычных дат все переводится в секунды и считается в целых числах
и еще раз повторю - вычислять сумму, где одно слагаемое очень большое, а второе очень маленькое, например :
2451545 + 0.0009
в виде флоат абсолютно бессмысленно. Можете сами убедится
Иногда улучшить точность можно, переписав правильно порядок операций
Например вот это
float J = 2451545 + 0.0009 + (27.560858/360) + 7598
надо делать вот так
float J = (0.0009 + (27.560858/360)) + 7598 + 2451545
потери точности будут меньше
Я не знаю, зачем вам 2.5 миллиона дней, но для обычных дат все переводится в секунды и считается в целых числах
Уравнение восхода солнца
2459142 - сегодняшний день по юлианскому календарю.
[/quote]
Я не знаю, зачем вам 2.5 миллиона дней, но для обычных дат все переводится в секунды и считается в целых числах
Уравнение восхода солнца
2459142 - сегодняшний день по юлианскому календарю.
Ну так, как уже сказали, зачем вам float? Делайте в целых числах. Для данного случая unsigned long.
float J = (2451545 + 0.0009 + (27.560858/360) + 7598)/10 = получаю 245914.2968750
Врешь. Число с такой точностью не поместится во float. Именно поэтому его нельзя использовать в данном случае.
Астротаймеры продаются за десятку у китайцев.
Прямо на дин рейку, в корпусе.
У меня в поселке таких уже лет пять 4 штуки стоят , свет включают.
https://mysku.ru/blog/aliexpress/31895.html
А формулы гляньте тут:
http://iopa4.narod.ru
Всё уже давно сделано, и даже на 8-ой меге
P.S.
Не помню название, но у Ардуины есть готовая библиотека
заката-восхода....
Переходить нужно на целые числа.
А вообще, для задачи восхода Солнца нужно просто выбросить весь колхоз вместе с формулами и пользоваться старой, доброй юниксовской time, благо, она есть.
Вы лучше определитесь, что именно Вам нужно
или время
Если второе, так весь Ваш колхоз вместе с "дробными" нужно просто выбросить, ибо готовое решение уже есть в системных библиотеках. Если бы Вы потрудились поискать, прежде, чем постить, то нашли бы тему в которой есть просто готовый пример определения времени восхода для двух городов безо всяких флоатов.
У double мантисса 48 разрядов - все больше, чем в long. Так что должно хватить (правильное округление - отдельный вопрос).
Любую техническую задачу можно решить разными способами. Если ТС умеет сделать через дробные числа и не умеет через целые - то почему нет?
У double мантисса 48 разрядов - все больше, чем в long. Так что должно хватить (правильное округление - отдельный вопрос).
К разрядности контроллера это не имеет никакого значения. И не хватит.
К разрядности контроллера это не имеет никакого значения.
Но на практике оказывается, что на 8-разрядном контроллере у double всего 32 разряда, тогда как на 32-разрядном - полноценные 64.
Пожалуйста, не надо рассказывать про практику, когда твоя практика ограничена двумя контроллерами, да и там ты не разобрался как это всё работает.
Пожалуйста, не надо рассказывать про практику, когда твоя практика ограничена двумя контроллерами, да и там ты не разобрался как это всё работает.
И если контроллеры в моих проектах работают именно так, как я задумал, то, вероятно, все-таки разобрался.
Или просто повезло.
В AVR нет float ну совсем. То, что ты делаешь, реализовано софтом, и точно так же может быть реализовано хоть с 32, хоть с 10, хоть со 156 бит. То же самое корректно для 32хбитных контроллеров без аппаратной поддержки float, коих великое множество.