Integer писал (а):Какая разница? Округленное 1,2 равно 1, 1,6 - 2. Можно больше знаков
после запятой написать и нормализовать до количества знаков
на 1 меньше, эффект тотже будет.
Ну и что? В итоге суть нормализации ведь и состоит в том, чтобы
понять, что два вещественных числа совпадают до заданной точности?
Выбирайте вариант, который на ваш взгляд подходит вам более
всего для вашей задачи и используйте его. NormalizeDouble(x-y,Digits) - в этой конструкции нормализация используется,
исходя из её сути. То что предлагаете вы во втором варианте -
это искусственно созданная ситуация, интересная скорее всего
просто из каких-то любознательных соображений, нежели в практическом
применении.
Какая разница? Округленное 1,2 равно 1, 1,6 - 2. Можно больше знаков
после запятой написать и нормализовать до количества знаков
на 1 меньше, эффект тотже будет.
Что-то я сомневаюсь, что Вы понимаете, что делаете.
Это будет равно нулю, так так 1.1-1.2 даст -0.1, которое округлится
до НУЛЯ знаков и станет 0.0
NormalizeDouble(1.1-1.2,0)
Это будет равно нулю, так так 1.2-1.6 даст -0.4, которое округлится
до НУЛЯ знаков и станет 0.0
А почему разработчики выбрали тип double. Я посмотрел в отладчике VS и увидел такую штуку Если в в программе делаю присвоение явно double dVar = 1.3 то отладчик показывает значение dVar 1.299999999.... Если же float fVar = 1.3 то вижу в отладчике, что значение fVar 1.30000
Так может быть разработчикам MT использовать просто тип float тогда нормализовать не надо вообще и математические операции с типом float будут быстрее происходить нежели с double. А точности float, на сколько я знаю, вполне хватает для представления котировок различных инструментов.
elritmo:
А почему разработчики выбрали тип double. Я посмотрел в отладчике
VS и увидел такую штуку
Так может быть разработчикам MT использовать просто тип float тогда
нормализовать не надо вообще и математические операции с типом
float будут быстрее происходить нежели с double. А точности float, на
сколько я знаю, вполне хватает для представления котировок
различных инструментов.
К сожалению, точности float явно не хватит при математических расчетах.
Мы ведь считаем не только профиты и цены, а огромные кумулятивные
массивы в индикаторах, где ошибки имеют обыкновение накапливаться.
Недостаточная точность сразу же вылезет наружу.
Ну для расcчётов то можно ввести переменные дополнительные типа double для всяких там коэффициентов рассчитываемых и временных переменных а значения цен пусть будут float. ну к примеру double dev = (double)Close[1]/Close[5]; где float Close[] то есть массив флотов В этом случае вы не потеряете точность если будете делить два double, а может быть даже потерятете из-за не точного представления чисел как вот в примере 1.30000 становится 1.2999999 в double. Делить и умножать и прочие сложные мат операции вы будете совершать изначально над числами с начальной погрешностью 1.2999999... или 1.300.....01 . Просто после сложных расчётов вы сможете привести значение цены снова к типу float. Значение индиктора вообще приводить к float и не потребуется. Зато сравнение и вычитание можно делать без всяких нормализаций значения цен, что увеличит скорость работы эксперта. И потом, зачем вам супер точность в расчёте индикторов, если как вы говорили они должны быть толстокожими и такие мелочные погрешности не должны сказываться на корректную работу эксперта. На разнице котировок от различных брокеров вы уже допускаете не хилую погрешность
Почему-то Вы на основе представления числа 1.3 делаете далеко
идущие выводы. float имеет гораздо меньшую точность по сравнению
с double. А на важных расчетах, касающихся денег, нужно использовать
максимальную точность. Поэтому лучше не надо пытаться экономить
на точности.
А вообще, за использование float вместо double нас бы трейдеры и программисты
давно бы запинали.
Ренат, float только для значения цен. А для других custom коэффициентов и промежуточных переменных для сложных расчётов использовать double 1.3 я взял как пример а представления значения цен с погрешностью я уже давно замечал. собственно для этого и использовать желательно повсеместно NormolizeDouble за что пользователи вашего софта или просто не догадываются что его стоит использовать при открытии позиций и сравнении цен или забывают. И вообще нормолайз замедляет работу эксперта. Если делим два float то можем получить double и дальше с ним работать уже с точностью double. Так же и другие мат операции и мат функции могут принимать как вход float который изначально не даёт погрешности а дальше идёт преобразование к double и работа с ним в расчётах. Я думаю стоит преобразовать массивы цен к float. Можно голосование на форуме разместить кто за массивы цен типа double и normalizeDouble а кто за массивы цен типа float и без всяких там нормалайз
elritmo: ... Так же и другие мат операции и мат функции могут принимать как вход float который изначально не даёт погрешности а дальше идёт преобразование к double и работа с ним в расчётах.
С чего Вы взяли, что тип float не дает погрешности? Тип float и тип double дают погрешности в связи с тем, что вещественные числа в памяти компьютера представляются не точно (тип целых чисел представляется в памяти компьютера точно). И при вычислениях, в которых участвуют вещественные числа, могут не выполняться такие свойства математики как: замкнутость, коммутативность и ассоциативность. Например, можно подобрать такие значения, что: (A*B)/B!=A (A+B)+C!=(A+C)+B. К тому же если использовать тип float, то проблемы с погрешностями начнутся раньше, чем при использовании double, так как под float отведено меньше байт, соответственно и вещественное число хранится во float с бОльшей погрешностью.
elritmo:
А почему разработчики выбрали тип double. Я посмотрел в отладчике
VS и увидел такую штуку
Если в в программе делаю присвоение явно
double dVar = 1.3
то отладчик показывает значение dVar 1.299999999....
Если же
float fVar = 1.3
то вижу в отладчике, что значение fVar 1.30000
Так может быть разработчикам MT использовать просто тип float тогда
нормализовать не надо вообще и математические операции с типом
float будут быстрее происходить нежели с double. А точности float, на
сколько я знаю, вполне хватает для представления котировок
различных инструментов.
А скаких пор экранное представление числа (то, что Вы видите
при распечатывании, в том числе и то, что Вам показывает отладчик)
связано только с точностью храниения? По секрету - оно в основном
связано с форматом вывода этого числа ;). Возьмите эксел - там
вообще целочисленныне значения можно как дату представить.
NormalizeDouble(x-y,Digits) - в этой конструкции нормализация используется, исходя из её сути. То что предлагаете вы во втором варианте - это искусственно созданная ситуация, интересная скорее всего просто из каких-то любознательных соображений, нежели в практическом применении.
Некорректно. Округление до целого.
Это будет равно нулю, так так 1.1-1.2 даст -0.1, которое округлится до НУЛЯ знаков и станет 0.0
Это будет равно нулю, так так 1.2-1.6 даст -0.4, которое округлится до НУЛЯ знаков и станет 0.0 Вы программист или как?
Вы программист или как?
Если в в программе делаю присвоение явно
double dVar = 1.3
то отладчик показывает значение dVar 1.299999999....
Если же
float fVar = 1.3
то вижу в отладчике, что значение fVar 1.30000
Так может быть разработчикам MT использовать просто тип float тогда нормализовать не надо вообще и математические операции с типом float будут быстрее происходить нежели с double. А точности float, на сколько я знаю, вполне хватает для представления котировок различных инструментов.
А почему разработчики выбрали тип double. Я посмотрел в отладчике VS и увидел такую штуку
Так может быть разработчикам MT использовать просто тип float тогда нормализовать не надо вообще и математические операции с типом float будут быстрее происходить нежели с double. А точности float, на сколько я знаю, вполне хватает для представления котировок различных инструментов.
ну к примеру
double dev = (double)Close[1]/Close[5];
где float Close[] то есть массив флотов
В этом случае вы не потеряете точность если будете делить два double, а может быть даже потерятете из-за не точного представления чисел как вот в примере
1.30000 становится 1.2999999 в double. Делить и умножать и прочие сложные мат операции вы будете совершать изначально над числами с начальной погрешностью
1.2999999... или 1.300.....01 . Просто после сложных расчётов вы сможете привести значение цены снова к типу float.
Значение индиктора вообще приводить к float и не потребуется.
Зато сравнение и вычитание можно делать без всяких нормализаций значения цен, что увеличит скорость работы эксперта.
И потом, зачем вам супер точность в расчёте индикторов, если как вы говорили они должны быть толстокожими и такие мелочные погрешности не должны сказываться
на корректную работу эксперта. На разнице котировок от различных брокеров вы уже допускаете не хилую погрешность
А вообще, за использование float вместо double нас бы трейдеры и программисты давно бы запинали.
1.3 я взял как пример а представления значения цен с погрешностью я уже давно замечал. собственно для этого и использовать желательно повсеместно NormolizeDouble за что пользователи вашего софта или просто не догадываются что его стоит использовать при открытии позиций и сравнении цен или забывают. И вообще нормолайз замедляет работу эксперта.
Если делим два float то можем получить double и дальше с ним работать уже с точностью double. Так же и другие мат операции и мат функции могут принимать как вход float
который изначально не даёт погрешности а дальше идёт преобразование к double и работа с ним в расчётах.
Я думаю стоит преобразовать массивы цен к float. Можно голосование на форуме разместить кто за массивы цен типа double и normalizeDouble а кто за массивы цен типа float и без всяких там нормалайз
... Так же и другие мат операции и мат функции могут принимать как вход float который изначально не даёт погрешности а дальше идёт преобразование к double и работа с ним в расчётах.
(A*B)/B!=A
(A+B)+C!=(A+C)+B.
К тому же если использовать тип float, то проблемы с погрешностями начнутся раньше, чем при использовании double, так как под float отведено меньше байт, соответственно и вещественное число хранится во float с бОльшей погрешностью.
А почему разработчики выбрали тип double. Я посмотрел в отладчике VS и увидел такую штуку
Если в в программе делаю присвоение явно
double dVar = 1.3
то отладчик показывает значение dVar 1.299999999....
Если же
float fVar = 1.3
то вижу в отладчике, что значение fVar 1.30000
Так может быть разработчикам MT использовать просто тип float тогда нормализовать не надо вообще и математические операции с типом float будут быстрее происходить нежели с double. А точности float, на сколько я знаю, вполне хватает для представления котировок различных инструментов.
Успехов.