Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> Математические операции с плавающей точкой.
DarkMaster
сообщение 26.10.2015, 18:57
Сообщение #1


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Данный плагин позволяет производит математические операции с числами с плавающей точкой.
Плагин необходимо поместить в папку Plugins рядом с uopilot.exe. Для работы требуются установленные библиотеки c++:
http://www.microsoft.com/ru-ru/download/de...s.aspx?id=40784

Код
math.dbl (<var1> <sign> <var2>)
<var1> - первое число (может быть не целым).
<sign> - знак математической операции (+-/*).
<var2> - второе число (может быть не целым).
Корректной последовательностью чисел с плавающей точкой для считается последовательность, удовлетворяющая следующим условиям:
    Знак положительного или отрицательного числа (необязательно).
    Последовательность цифр, как вариант, может содержать десятичную точку или запятую.
    Дополнительная экспонентная часть, которая сама по себе состоит из символа 'e' или 'E',
        после которого следует дополнительный знак и последовательность цифр.
Диапазон значений:
    min:  2,2250738585072014 E – 308
    max: 1,7976931348623158 E + 308

Результат работы функции должен быть присвоен массиву. Возвращаемые значения:
%a [1] - результат математической операции. Если функция завершилась с ошибкой, вернет "0".
%a [2] - возвращает OK, если функция успешно выполнена, Error, если произошла ошибка.
%a [3] - расшифровка ошибки:
Succes - функция завершилась успешно. (%a [2]="OK")
First value: ERANGE - первый параметр за пределами допустимого значения.
Second value: ERANGE - второй параметр за пределами допустимого значения.
No sign: [символ] - знак математической операции не найден.

Пример:
set %a math.dbl (12.1 / 3)
log Результат вычислений: %a [1]
log Ошибка: %a [2]
log Текст ошибки: %a [3]

В плагин не следует передавать несколько математический операций, использовать скобки и т.д.
Функция должна принять только перечисленные выше параметры.
Если необходимо произвести какие-либо длинные математические вычисления,
то производите их до передачи параметров или используйте eval().
При работе с числами с плавающей точкой нужно понимать:
Расчет формулы «x2-y2» лучше вычислять используя формулу «(x-y)(x+y)».
В арифметике с плавающей запятой правило (a*b)*c = a*(b*c) не выполняется для любых арифметических операций.
Не все десятичные числа имеют двоичное представление с плавающей запятой. Например, число «9999999999.2» будет представлено как «9999999999.200001».
При сравнении чисел с плавающей точкой не корректно выражение:
a < b
Для подобного сравнения правильным будет сравнение разницы чисел с некоторой константой:
c = a - b
abs(c) < 0.1
0.1 взято для примера, точность вы можете задать самостоятельно.

Так же необходимо понимать, что использование чисел с плавающей точкой(в т.ч. их разницы) в пилоте
по средствам оператора if может быть не корректным.


Сообщение отредактировал DarkMaster - 2.4.2016, 10:17


Прикрепленные файлы
Прикрепленный файл  math.zip ( 3,85 килобайт ) Кол-во скачиваний: 1599


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.10.2015, 2:33
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Пример:
set %a (12.1 / 3)

Код
set %a math.dbl (12.1 / 3)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.10.2015, 6:08
Сообщение #3


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Спасибо.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 13.11.2015, 2:26
Сообщение #4


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Скрипт 1, работает, проблем нет
Код
set %a math.dbl (1234,567 / 37)
log %a [1]
stop_script

Скрипт 2, не работает
Код

set %b WindowStatus.find (1111 *UoPilot  v2.35   WK* TfmMain)       //поиск пилота (работает, тут нет проблем)
set %a math.dbl (1234,567 / 37)
log %a [1]    //результат 0
stop_script

Лог второго скрипта
Код
set %b WindowStatus.find (1111 *UoPilot  v2.35   WK* TfmMain)
%TfmMain) [ 2 1 ] = 525014
set %a math.dbl (1234,567 / 37)
%37) [ 4 1 ] = No sign: .
log %a(0) [1]
0
stop_script

Если использовать плагин для поиска окна, причём в любой вкладке, то математические операции после этого не работают. Начнут работать только после перезапуска пилота.
No sign:, почему-то не видит знак операции.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 13.11.2015, 11:14
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Надо тыкать кнайта. Что-то не так с областями видимости походу.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.4.2016, 10:21
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Проблема оказалась в изменении локали плагином для поиска окон. Локаль сохраняется и приводит к тому, что стандартная функция c++ перестает воспринимать точку, как десятичный разделитель, и требует запятую. Запятую можешь не ставить - они заменяются на точки при парсинге строки. В описании функции с++, которая начинает сыпаться явно указано "десятичная точка", т.е. по сути получается нарушение стандарта.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 2.4.2016, 10:41
Сообщение #7


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Так с точкой также результат 0.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.4.2016, 10:49
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Дык в том то и фишка, что он запятую требует после плагина с поиском окон. А запятая не пройдет, т.к. все запятые автоматически заменяются на точки для соответствия заявленным стандартам.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 2.4.2016, 11:01
Сообщение #9


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Так плагин с точкой тоже должен работать.
Код
set %b WindowStatus.find (1111 *UoPilot  v2.35   WK* TfmMain)
set %a math.dbl (1234.567 / 37)     //тут нет запятых
log %a [1]
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.4.2016, 11:22
Сообщение #10


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
Так плагин с точкой тоже должен работать.

Должен, пока другой плагин не подменил локаль.
Считай делиметр он изменяет.

Может так будет понятнее. Самое начало функции, собственно парсинг:
Код
    // Заменяем все запятые на точки.
    for (unsigned char i = 0; ParamStruct->ParamString[i] != '\0'; i++){
        if (ParamStruct->ParamString[i] == ','){
            ParamStruct->ParamString[i] = '.';
        }
    }


    char * pPos; // Указатель на последний символ разобранной строки +1 (вернет значение).
    double firstVal = strtod(ParamStruct->ParamString, &pPos) // А вот тут будет ошибка;

Если запятые на точки не менять - работать не будет со стандартной локалью. Если локаль русская, то замена точек на запятые не нужна и приводит к ошибке.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 2.4.2016, 12:07
Сообщение #11


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Т.е. только перезагружать плагины?
Код
set %b WindowStatus.find (1111 *UoPilot  v2.36.1   WK* TfmMain)
pluginreload
set %a math.dbl (1234,567 / 37)
log %a [1]
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.4.2016, 12:18
Сообщение #12


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Ну пока - да. Вообще могу под запятую быро скомпилить. Кнайт не вовремя свалил из аськи. Надо обсудить и понять, что с этим делать. Со своей стороны я могу и локаль принудительно менять под нужную и попробовать изменить плагин поиска окна. Т.е. решить проблему можно и на моей стороне без особых трудозатрат. Просто надо понять, как это сделать наиболее корректно.

Сообщение отредактировал DarkMaster - 2.4.2016, 12:19


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 15.6.2019, 1:19
Сообщение #13


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1319
Пользователь №: 18.346
Возраст: 25



Есть в 2019 году способ умножения десятичных чисел?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.6.2019, 2:26
Сообщение #14


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Есть в 2019 году способ умножения десятичных чисел?

Плагин использовать или писать скрипт на луа.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 15.6.2019, 15:04
Сообщение #15


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1319
Пользователь №: 18.346
Возраст: 25



а чо когда выполняю такой код
Код
set %arr [1 13] 8
set %op [1 2] math.dbl (%arr [1 13] * 2.25)
log %op [1 2]
end_script

в лог выдает:
Цитата
18,000000
OK
Succes

нельзя ли в таком виде отбросить лишнее отображение ок и третей строки? а также чо он не округляет цифры? Как округлить до тысячных или до сотых или десятых если на конце 0. К целым то понятно есть round или trunc а вот до тысячных не знаю. Задать бы как что бы после запятой или точки копировало 3 цифры то можно было бы использовать функцию Delete, но не известно из скольких символов будет состоять целая часть
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.6.2019, 19:08
Сообщение #16


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



В первом посте пример есть:
Код
set %a math.dbl (12.1 / 3)
log Результат вычислений: %a [1]
end_script

Цитата
Как округлить

Зачем?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 15.6.2019, 19:40
Сообщение #17


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1319
Пользователь №: 18.346
Возраст: 25



Цитата(cirus @ 15.6.2019, 19:08) *

В первом посте пример есть:
Код
set %a math.dbl (12.1 / 3)
log Результат вычислений: %a [1]
end_script


Зачем?

Да как бы нужно значения до тысячных этот скрипт заточен под генерацию кода wiki страничек. Конечно можно вручную править оно не сложно, но если есть возможность как то это избежать то сами понимаете лишний гемор не к чему
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.6.2019, 20:44
Сообщение #18


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Да как бы нужно значения до тысячных этот скрипт заточен под генерацию кода wiki страничек.

Лучше луа для этого. Синтаксис пилота не слишком удобен для работы со строками.
Код
set %a math.dbl (8 * 2.26)

log clear
log mode compact
log Результат вычислений: %a [1]

set $temp %a [1]
set $a trunc($temp)
set $b frac($temp)

while 1 = 1
    set $temp copy($b size($b) 1)
    if  $temp = 0
        set $b Delete($b size($b) 1)
    else
        break
    end_if
end_while

set %a[1] $a
if  $b != ""
    set %a [1 2] ","
    set %a [1 3] $b
end_if
log %a [1]
end_script
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 27.6.2019, 19:35
Сообщение #19


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2420
Пользователь №: 18.746



Цитата(FREEON @ 15.6.2019, 1:19) *

Есть в 2019 году способ умножения десятичных чисел?

Имеется в виду, что дробные числа будут только в аргументах? На выходе устроит целое число?


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 27.6.2019, 20:53
Сообщение #20


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1319
Пользователь №: 18.346
Возраст: 25



Цитата(Fors1k @ 27.6.2019, 19:35) *

Имеется в виду, что дробные числа будут только в аргументах? На выходе устроит целое число?

Не, результат тоже нужен был нецелым(если таковым получается). Так как нецелое можно представить в виде:
2,5 = 25/10
1,66 = 166/100
и т.д.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V  1 2 >
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 19:26
Designed by Nickostyle