Страница 64 из 64 ПерваяПервая ... 1454626364
Показано с 631 по 634 из 634

Тема: Создать функцию на ST

  1. #631

    По умолчанию

    Цитата Сообщение от zjWlad Посмотреть сообщение
    Кстати, при последовательном вычислении членов ряда ошибка не возникает. Значение функций SIN_Rad и SIN_Rad2 практически совпадают. По данным fSUB разность 5.96E-8 отмечается лишь на некоторых углах (+/- 50, 245, 255 … - проверял через 5 градусов)). Извиняюсь за грубое редактирование (только для примера).
    Вас не смущает, что добавив цикл вы только усложнили функцию циклом, ничего не улучшив,
    точность не лучше, на 90 и 270 градусах не работает, длительность цикла ПР выросла (по этой причине и отказался от рядов Тейлора). Какой смысл тогда?
    Моя доработка хотя бы исправила работу на 90 и 270 градусах.
    Последний раз редактировалось kondor3000; 10.02.2026 в 08:37.

  2. #632

    По умолчанию

    kondor3000.
    Я действительно поспешил и ошибся в тестировании. Похоже в SIN_Rad ошибка спрятана в выражении:
    b:=(Pi-a) * (bool_to_real(a>1.5707964))+a * bool_to_real(not(a>=1.5707964)) ; // 1,5707964
    Именно оно обращается в ноль при 1,5707964.
    Ну а пятикратный вызов простеньких выражений оформленный в виде цикла скорее всего не тяжелее пятикратного вызова pow()
    ( pow() во все времена была более тяжелой и часто менее точной чем арифметические операции, но возможно в Logic и не так).

  3. #633

    По умолчанию

    kondor3000.
    1 Похоже для устранения ошибки в SIN_Rad в выражении для b надо заменить сравнение «больше или равно»
    на просто «больше», т.е. как то так:
    b:=(Pi-a) * (bool_to_real(a>1.5707964))+a * bool_to_real(not(a>1.5707964)) ; // 1,5707964
    2 В исправленной функции (из-за того что сравнение для исключения проводилось с входным аргументом
    а не преобразованным значением) были исключены только четыре точки. А их гораздо больше, например,
    минус 4,712389, минус 7,853982 и т.п. Можно конечно оговорить область определения, но …

    Вы автор – Вам виднее.

  4. #634

    По умолчанию

    Цитата Сообщение от zjWlad Посмотреть сообщение
    kondor3000.
    1 Похоже для устранения ошибки в SIN_Rad в выражении для b надо заменить сравнение «больше или равно»
    на просто «больше», т.е. как то так:
    b:=(Pi-a) * (bool_to_real(a>1.5707964))+a * bool_to_real(not(a>1.5707964)) ; // 1,5707964
    2 В исправленной функции (из-за того что сравнение для исключения проводилось с входным аргументом
    а не преобразованным значением) были исключены только четыре точки. А их гораздо больше, например,
    минус 4,712389, минус 7,853982 и т.п. Можно конечно оговорить область определения, но …

    Вы автор – Вам виднее.
    А вот это хорошая мысль, достаточно убрать = и оставить > и всё работает правильно во всех точках.
    И я не автор, всего лишь переписал на ST функции и астротаймер с форума.

Страница 64 из 64 ПерваяПервая ... 1454626364

Похожие темы

  1. Ответов: 14
    Последнее сообщение: 01.07.2023, 21:30
  2. Ответов: 6
    Последнее сообщение: 22.12.2021, 10:50
  3. Ответов: 3
    Последнее сообщение: 13.09.2021, 13:31
  4. ПЛК160. Чем заменить функцию записи 0x05?
    от FallenDAY в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 26.08.2017, 13:19
  5. Как написать собственную функцию wait()
    от PavelKazakov в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 23.07.2009, 11:37

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •