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

Пользовательские блоки дополняющие возможности стандартных блоков из разделов Математика и Алгебра, а так-же различные цифровые фильтры
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Аватара пользователя
rw6cm
Полковник
Сообщения: 2372
Зарегистрирован: 06 сен 2015, 20:25
Имя: Владимир
Поблагодарили: 41 раз

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

Сообщение rw6cm »

Ingwar писал(а): 12 мар 2023, 12:26 Но стоит записать результат расчета в перемененную Flprog, то карета превращается в тыкву
К сожалению ((
По этому работать с Double в флпрог сложно.
Нужно не только избегать переменных float, но и блоков которые в себе могут изменять double.
Надеюсь что Автор когда-нибудь устранит этот недостаток. а пока новичкам лучше не лезть в эти дебри )
Win10-64, FLProg (portable)
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

[ref=#ff8000]rw6cm[/ref], добавьте пожалуйста (как будет желание) в Ваш блок мат операции с выходом в стринг, чтоб не потерять результат.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

Ingwar писал(а): 12 мар 2023, 12:26
rw6cm писал(а): 12 мар 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 секунд:
Просьба протестить. Самому интересно
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

Sancho писал(а): 12 мар 2023, 12:57 Нет. Переменная будет нормальной.
Почему тогда результат одинаковый и неверный?
Тут
Безымянный.png
Отправлено спустя 7 минут 55 секунд:
Sancho писал(а): 12 мар 2023, 13:00 Просьба протестить. Самому интересно
У меня платка под рукой только с экраном. На ней не использовал UART.
А с экраном уже выше описал.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

тогда 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
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

Sancho писал(а): 12 мар 2023, 13:20 Основная мысль из ссылки
Если писать мат операции с double чисто в IDE, то точность двойная.
Ведь ардуино это уже давно не только 8-битный AVR...
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2473
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 40 раз

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

Сообщение Dryundel »

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

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

.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

Dryundel писал(а): 12 мар 2023, 14:31 Делаем элементарный блок с одной лишь строкой
Я не в теме - тапками не кидайте.
Можно какой нить аналог для пределов платы? Тогда и библиотеки не "пострадают"))
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2473
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 40 раз

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

Сообщение Dryundel »

[ref]Ingwar[/ref], библиотеки не пострадают. А вот результат могут снова вернуть во float.
Вот и вся беда.
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

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

Например, если вы определяете #define внутри функции, то это определение будет действовать только в пределах этой функции. Кроме того, если вы используете #define для определения константы внутри функции, то эта константа будет создана каждый раз при вызове функции, что может привести к нежелательному потреблению памяти.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2473
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 40 раз

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

Сообщение Dryundel »

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

Отправлено спустя 3 минуты 35 секунд:
А при таком дефайне алгоритму не навредишь. Ну если только какая экзотика.
artemka19
Лейтенант
Сообщения: 540
Зарегистрирован: 03 сен 2020, 15:41
Откуда: Питер
Имя: Артем
Поблагодарили: 1 раз

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

Сообщение artemka19 »

[ref]Ingwar[/ref], а это имеет какое то практическое применение?
или чисто в шахматы сыграть?)
Аватара пользователя
Dryundel
Полковник
Сообщения: 2473
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 40 раз

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

Сообщение Dryundel »

[ref]artemka19[/ref], к примеру GPS
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

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

Отправлено спустя 3 минуты 54 секунды:
Еще бы кто подсказал, какие ПБ использовать для сохранения/чтения float в stm32 (не штатный) с ядром stm32duino....)
Штатные (8.0.2) не хотят.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
rw6cm
Полковник
Сообщения: 2372
Зарегистрирован: 06 сен 2015, 20:25
Имя: Владимир
Поблагодарили: 41 раз

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

Сообщение rw6cm »

Dryundel писал(а): 12 мар 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
Полковник
Сообщения: 2473
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 40 раз

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

Сообщение Dryundel »

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

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

Сообщение rw6cm »

Dryundel писал(а): 13 мар 2023, 11:44 Это прозвучало так, что моя идея - это бредятина.
Нив коем случае ))
Эта идея хороша, особенно для новичков. Не надо переживать что где то упустил точность расчетов.
Dryundel писал(а): 13 мар 2023, 11:44 Попробуйте с конвертера в переменную флоат, а уже ее в UART
[spoiler]
С #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 естественно будет.
В описании ПБ написано, что не каких промежуточных переменных и блоков с ними.
[/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64, FLProg (portable)
Аватара пользователя
Dryundel
Полковник
Сообщения: 2473
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 40 раз

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

Сообщение Dryundel »

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

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

Сообщение rw6cm »

Dryundel писал(а): 13 мар 2023, 13:04 И снова вуаля!
Когда знаешь что нужно и как это можно сделать на с++, то флпрог не нужен :)
А так как идея добавить пару "кубиков" для облегчения жизни в флпрог :smile9:
Dryundel писал(а): 13 мар 2023, 11:44 или просить автора снять ограничение ввода.
В данном случае думаю здесь не флп виновник а иде, она обрезает экспонентой все лишнее в float
2023_03_13_13_16_07_COM3.png
C double это число проходит
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64, FLProg (portable)
Аватара пользователя
Dryundel
Полковник
Сообщения: 2473
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 40 раз

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

Сообщение Dryundel »

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

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя