И снова о сравнении двух double - страница 2

 
Integer писал (а):Какая разница? Округленное 1,2 равно 1, 1,6 - 2. Можно больше знаков после запятой написать и нормализовать до количества знаков на 1 меньше, эффект тотже будет.

Ну и что? В итоге суть нормализации ведь и состоит в том, чтобы понять, что два вещественных числа совпадают до заданной точности? Выбирайте вариант, который на ваш взгляд подходит вам более всего для вашей задачи и используйте его.
NormalizeDouble(x-y,Digits) - в этой конструкции нормализация используется, исходя из её сути. То что предлагаете вы во втором варианте - это искусственно созданная ситуация, интересная скорее всего просто из каких-то любознательных соображений, нежели в практическом применении.
 
Integer:
FION:
Некорректно. Округление до целого.
Какая разница? Округленное 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
NormalizeDouble(1.2-1.6,0)==0
Вы программист или как?
 
Renat писал (а):
Вы программист или как?
Не имею жестких самоидентификаций.
 
А почему разработчики выбрали тип 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, на сколько я знаю, вполне хватает для представления котировок различных инструментов.

А скаких пор экранное представление числа (то, что Вы видите при распечатывании, в том числе и то, что Вам показывает отладчик) связано только с точностью храниения? По секрету - оно в основном связано с форматом вывода этого числа ;). Возьмите эксел - там вообще целочисленныне значения можно как дату представить.

Успехов.
Причина обращения: