Вычисления двойной точности

Пользовательские блоки дополняющие возможности стандартных блоков из разделов Математика и Алгебра, а так-же различные цифровые фильтры
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Вычисления двойной точности

#1

Сообщение Ingwar » 12.03.2023{, 09:35}

Блоки для вычислений точностью больше чем 7 разрядов (флоат).
Лучше использовать с 32-битными камнями.
Безымянный.png
математика double.ubl
(111.26 КБ) 23 скачивания
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2284
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 335
Имя: Владимир

Вычисления двойной точности

#21

Сообщение rw6cm » 12.03.2023{, 12:44}

Ingwar писал(а):
12.03.2023{, 12:26}
Но стоит записать результат расчета в перемененную Flprog, то карета превращается в тыкву
К сожалению ((
По этому работать с Double в флпрог сложно.
Нужно не только избегать переменных float, но и блоков которые в себе могут изменять double.
Надеюсь что Автор когда-нибудь устранит этот недостаток. а пока новичкам лучше не лезть в эти дебри )
Win10-64, FLProg (portable)

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Вычисления двойной точности

#22

Сообщение Ingwar » 12.03.2023{, 12:47}

rw6cm, добавьте пожалуйста (как будет желание) в Ваш блок мат операции с выходом в стринг, чтоб не потерять результат.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Вычисления двойной точности

#23

Сообщение Sancho » 12.03.2023{, 12:55}

Ingwar писал(а):
12.03.2023{, 12:26}
rw6cm писал(а):
12.03.2023{, 12:19}
Вы сами посмотрите что будет
Но стоит записать результат расчета в перемененную Flprog, то карета превращается в тыкву :smile113:
Нет. Переменная будет нормальной.
Код, генерируемый программой
#include "flprogUtilites.h"
float I1_36734898_1;
float I2_36734898_1;
float Q_36734898_1;
float _gtv1 = 1.11111e6;
bool _stou25273184= 0;
bool _stou18158727= 0;
bool _stou206840228= 0;

Отправлено спустя 1 минуту 34 секунды:
Переменная обрезается на стадии генерации кода.
Приведённый пример получения нормального значения из стринг обходит это ограничение Автора.

Отправлено спустя 2 минуты 55 секунд:
Просьба протестить. Самому интересно
Вложения
Сравнение вычислений float double_01.flp
(608.19 КБ) 19 скачиваний
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Вычисления двойной точности

#24

Сообщение Ingwar » 12.03.2023{, 13:07}

Sancho писал(а):
12.03.2023{, 12:57}
Нет. Переменная будет нормальной.
Почему тогда результат одинаковый и неверный?
Тут
Безымянный.png
Отправлено спустя 7 минут 55 секунд:
Sancho писал(а):
12.03.2023{, 13:00}
Просьба протестить. Самому интересно
У меня платка под рукой только с экраном. На ней не использовал UART.
А с экраном уже выше описал.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Вычисления двойной точности

#25

Сообщение Sancho » 12.03.2023{, 13:17}

тогда http://mypractic-forum.ru/viewtopic.php?t=24

Отправлено спустя 2 минуты 39 секунд:
Основная мысль из ссылки
Тип float имеет точность 6-7 знаков, имеются ввиду все знаки, а не только мантисса. Обычно для увеличения точности используют другой тип - double, но на платформе Arduino, double и float имеют одинаковую точность.
float – 4 байта 1.175E-38.. 3.402E+38 Числа с плавающей точкой, точность: 6-7 знаков
double – 4/8 байт 2.225E-308.. 1.797E+308 Для AVR то же самое, что float.
На ESP и прочих 32-бит МК – 8 байт, точность – 15-16 знаков
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Вычисления двойной точности

#26

Сообщение Ingwar » 12.03.2023{, 13:29}

Sancho писал(а):
12.03.2023{, 13:20}
Основная мысль из ссылки
Если писать мат операции с double чисто в IDE, то точность двойная.
Ведь ардуино это уже давно не только 8-битный AVR...
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Вычисления двойной точности

#27

Сообщение Dryundel » 12.03.2023{, 14:31}

Ingwar писал(а):
12.03.2023{, 13:29}
Если писать мат операции с double чисто в IDE, то точность двойная.
Кароч, господа.
При использовании переменных float в проекте, да и просто при конвертации результата в String, мы возвращаемся к нашей пресловутой float. А соответственно и результат получаем с её точностью в 6 знаков.

Решение такое. Делаем элементарный блок с одной лишь строкой #define float double. Пихаем его в проект и вуаля! На 32 битных контроллерах имеем двойную точность и правильный результат.
.
define float double.jpg
define float double.jpg (21.12 КБ) 626 просмотров
define float double.flp
(231.87 КБ) 15 скачиваний
.
Ну и маленькая ложечка дегтя.
Используемые библиотеки могут не догадываться, что мы такие умные. :D

.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Вычисления двойной точности

#28

Сообщение Ingwar » 12.03.2023{, 14:43}

Dryundel писал(а):
12.03.2023{, 14:31}
Делаем элементарный блок с одной лишь строкой
Я не в теме - тапками не кидайте.
Можно какой нить аналог для пределов платы? Тогда и библиотеки не "пострадают"))
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Вычисления двойной точности

#29

Сообщение Dryundel » 12.03.2023{, 14:46}

Ingwar, библиотеки не пострадают. А вот результат могут снова вернуть во float.
Вот и вся беда.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Вычисления двойной точности

#30

Сообщение Ingwar » 12.03.2023{, 14:51}

Dryundel писал(а):
12.03.2023{, 14:46}
А вот результат могут снова вернуть во float.
При случае проверю вариант, когда определяешь границу "от" и "до", где действует #define.
Например "обернув" в функцию если позволит редактор)))
Делаю предположение на основе ответа "одаренного товарища"))
Да, можно использовать #define внутри функции Arduino. Однако, следует понимать, что #define является директивой препроцессора, которая выполняется на этапе компиляции кода, и его использование внутри функции может привести к неожиданным результатам.

Например, если вы определяете #define внутри функции, то это определение будет действовать только в пределах этой функции. Кроме того, если вы используете #define для определения константы внутри функции, то эта константа будет создана каждый раз при вызове функции, что может привести к нежелательному потреблению памяти.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Вычисления двойной точности

#31

Сообщение Dryundel » 12.03.2023{, 14:57}

Ingwar писал(а):
12.03.2023{, 14:51}
При случае проверю вариант, когда определяешь границу "от" и "до", где действует #define.
Да я тебе и так расскажу.
Действовать он будет в файле .h подключённой библиотеки. А вот до файла. срр дефайном не достать.

Отправлено спустя 3 минуты 35 секунд:
А при таком дефайне алгоритму не навредишь. Ну если только какая экзотика.

artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03.09.2020{, 15:41}
Репутация: 216
Откуда: Питер
Имя: Артем

Вычисления двойной точности

#32

Сообщение artemka19 » 12.03.2023{, 15:10}

Ingwar, а это имеет какое то практическое применение?
или чисто в шахматы сыграть?)

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Вычисления двойной точности

#33

Сообщение Dryundel » 12.03.2023{, 15:18}

artemka19, к примеру GPS

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Вычисления двойной точности

#34

Сообщение Ingwar » 12.03.2023{, 15:27}

artemka19 писал(а):
12.03.2023{, 15:10}
или чисто в шахматы сыграть?)
Да даже и так имеет смысл))
А по факту, у меня есть в проекте 32-битные (с внешней периферии) значения и операции над ними, результат которых зачастую дробный.

Отправлено спустя 3 минуты 54 секунды:
Еще бы кто подсказал, какие ПБ использовать для сохранения/чтения float в stm32 (не штатный) с ядром stm32duino....)
Штатные (8.0.2) не хотят.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2284
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 335
Имя: Владимир

Вычисления двойной точности

#35

Сообщение rw6cm » 13.03.2023{, 10:55}

Dryundel писал(а):
12.03.2023{, 14:31}
Делаем элементарный блок с одной лишь строкой #define float double. Пихаем его в проект и вуаля! На 32 битных контроллерах имеем двойную точность и правильный результат.
Здесь надо понимать, что все что связано с float числами при таком методе будут съедать больше памяти и процессорного времени.
Ради одного точного вычисления жертвовать..., при безысходности можно и таким методом воспользоваться.
Но здесь не решается главный вопрос, как вводить эти нужные коэффициенты, и числа с double возможностями в флпрог?
Пробуем в вашем примере подставить в место однозначных целых чисел, число с возможностью double (допустим больше 8 знаков)
и получаем бредятину ))
Мне пришлось с этим столкнуться несколько лет назад.
При расчетах связанных с Луной, нужно было вводить в работающем проекте поправочный коэффициент.
Константы, переменные, конвертация строк, все возможные методы ввести эти данные в флпрог, давали искаженный результат.
Тогда и сделал ПБ конвертер в double. Потом он мне понадобился для расчета GPS координат. В остальном точности float мне хватало.
Возьмем реальный пример. Надо ввести Юлианскую дату (JD) в проекте возможностями флпрог.
И видим что этой возможности нет. И #define float double здесь не спасает.
2023_03_13_10_17_56_FLProg_8.1.0.png
Win10-64, FLProg (portable)

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Вычисления двойной точности

#36

Сообщение Dryundel » 13.03.2023{, 11:44}

rw6cm писал(а):
13.03.2023{, 10:55}
при таком методе будут съедать больше памяти и процессорного времени.
Ради одного точного вычисления жертвовать..., при безысходности можно и таким методом воспользоваться.
Согласен. Есть такой момент. Но если проект требует двойной точности. Оно стоит того. Да и речь идет о 32 битных контроллерах. Скорости позволяют такую блажь в определенных границах.
rw6cm писал(а):
13.03.2023{, 10:55}
Но здесь не решается главный вопрос, как вводить эти нужные коэффициенты
Здесь только делать конвертер из стринга или просить автора снять ограничение ввода.
rw6cm писал(а):
13.03.2023{, 10:55}
Пробуем в вашем примере подставить в место однозначных целых чисел, число с возможностью double (допустим больше 8 знаков)
и получаем бредятину ))
Это прозвучало так, что моя идея - это бредятина. :)
Я не претендую на идеальность варианта решения и это всего лишь идея в общем поиске.
rw6cm писал(а):
13.03.2023{, 10:55}
Возьмем реальный пример. Надо ввести Юлианскую дату (JD) в проекте возможностями флпрог.
И видим что этой возможности нет. И #define float double здесь не спасает.
Это опять по поводу ввода? Так нужен всего лишь блок конвертера из строки с float выходом.
Попробуйте с конвертера в переменную флоат, а уже ее в UART. Предполагаю, что все получится.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2284
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 335
Имя: Владимир

Вычисления двойной точности

#37

Сообщение rw6cm » 13.03.2023{, 12:35}

Dryundel писал(а):
13.03.2023{, 11:44}
Это прозвучало так, что моя идея - это бредятина.
Нив коем случае ))
Эта идея хороша, особенно для новичков. Не надо переживать что где то упустил точность расчетов.
Dryundel писал(а):
13.03.2023{, 11:44}
Попробуйте с конвертера в переменную флоат, а уже ее в UART
СпойлерПоказать
С #define float double
2023_03_13_12_12_37_FLProg_8.1.0.png
Без #define float double
2023_03_13_12_18_05_COM3.png
Как видим для SConv разницы ни какой.
А для ПБ str>double естественно будет.
В описании ПБ написано, что не каких промежуточных переменных и блоков с ними.
Win10-64, FLProg (portable)

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Вычисления двойной точности

#38

Сообщение Dryundel » 13.03.2023{, 12:55}

rw6cm писал(а):
13.03.2023{, 12:35}
Как видим для SConv разницы ни какой.
Ок. Давайте разберемся со штатным SConv. Он использует стринговую функцию toFloat().
Не вопрос. К имеющейся #define float double, добавляем в наш блок еще одну строку #define toFloat toDouble
К сожалению штатный блок UART не имеет настроек вывода знаков после запятой. А НАДО БЫ!
Но и этот момент объезжаем на хромой козе.
И снова вуаля! :) И даже сторонних конвертеров не потребовалось. И никакой бредятины.
.
105.jpg
105.jpg (25.84 КБ) 510 просмотров
105.flp
(159.52 КБ) 12 скачиваний
Отправлено спустя 9 минут 2 секунды:
rw6cm писал(а):
13.03.2023{, 12:35}
Эта идея хороша, особенно для новичков. Не надо переживать что где то упустил точность расчетов.
Вот и я про то.
Знаешь что мне в чате FLProg сказали?
Типа, мы тут кубики переставляем, а ты какие то скрины генерируемых FLProg кодов показываешь. Нефиг тут умничать :)

Аватара пользователя
rw6cm
Полковник
Сообщения: 2284
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 335
Имя: Владимир

Вычисления двойной точности

#39

Сообщение rw6cm » 13.03.2023{, 13:35}

Dryundel писал(а):
13.03.2023{, 13:04}
И снова вуаля!
Когда знаешь что нужно и как это можно сделать на с++, то флпрог не нужен :)
А так как идея добавить пару "кубиков" для облегчения жизни в флпрог :smile9:
Dryundel писал(а):
13.03.2023{, 11:44}
или просить автора снять ограничение ввода.
В данном случае думаю здесь не флп виновник а иде, она обрезает экспонентой все лишнее в float
2023_03_13_13_16_07_COM3.png
C double это число проходит
Win10-64, FLProg (portable)

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Вычисления двойной точности

#40

Сообщение Dryundel » 13.03.2023{, 13:45}

rw6cm писал(а):
13.03.2023{, 13:35}
В данном случае думаю здесь не флп виновник а иде, она обрезает экспонентой все лишнее в float
IDE здесь ни при чем. Мы же уже задефайнили все float.
Ограничения уже в окне программы FLProg.
106.jpg
Отправлено спустя 6 минут 44 секунды:
107.jpg

Ответить

Вернуться в «Блоки для рассчетов и цифровые фильтры»