Правильный перевод double в int - страница 2

 
Dmitry Fedoseev:

Серьезно? Разве разницу сравнивают не для экономии?

Absolutely:

Второй способ предполагает сравнивать нормализованную разность двух вещественных чисел с нулевым значением. Сравнивать разность нормализованных чисел с нулём бесполезно, так как в результате любой математической операции с нормализованными числами результат получается ненормализованным.

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Scriptor:

Не верное сравнение. Сравнивать необходимо нормализованную разницу. При сравнении двух нормализованных чисел, результат получается опять не нормализованный.

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

например, NormalizeDouble(0.06, 1)==NormalizeDouble(0.14, 1).  Т.е. разница между числами составляет 80% от точности округления, но получаем равенство.

 
Scriptor:

Absolutely:

Absolutely not

 
Алексей Тарабанов:

Семен Семенович ... 

Сравнение двух вычисляемых double на равенство ... Кю

Внимательно прочитайте первый пост сей темы. А то "слышал звон, да не знаю где он".

 
Scriptor:

... При сравнении двух нормализованных чисел, результат получается опять не нормализованный.

Почитайте на досуге свой тезис, какую чушь вы несете, осознайте.

Как может быть результат сравнения нормализованным или ненормализованным, если он может быть только true или false?

С чего вы взяли, что кто-то собирается вычислять разницу двух нормализованных чисел, а потом сравнивать ее с нулем? Два нормализованных числа можно сразу сравнивать, не вычисляя между ними разницу. И тоже первый пост темы почитайте - о чем там вопрос - о переводе double в int.

 
Alexey Navoykov:

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

например, NormalizeDouble(0.06, 1)==NormalizeDouble(0.14, 1).  Т.е. разница между числами составляет 80% от точности округления, но получаем равенство.

Так нормализуйте до приемлемой точности. Если округляете одного знака, то еще и в средней школе известно, что 0.06 будет равно 0.14.  

 

А вообще офигеть, какой дремучи бред несет половина сидящих здесь.

От одного слова "нормализация" реакция как у зомби: руки вперед, голова в сторону, язык наружу и ходьба с высоким подниманием бедра.

 
Я тоже отмечусь. Зачем нужна нормализация даблов?

Первый ответ. Для преобразования цены таким образом, чтобы торговый сервер мог опознать цену как свою, из этой же системы, правильно округленную, как будто это сам сервер округлял.

Второй ответ. Не секрет, что один и тот же результат может быть получен несколькими способами. Например, деление на 2 эквивалентно умножению на 0.5. Однако, в большинстве случаев вы получите разницу в 17 знаке. Небольшую но разницу. Нормализация, из-за своего алгоритма, позволяет получить совершенно одинаковый результат для эквивалентных вычислений.

NormalizeDouble - это очень дорогая функция. Дороже, чем простое округление. Проверьте профилировщиком. Используйте только для получения цены. В обычной жизни старайтесь избегать NormalizeDouble
 

я ж в первом посте написал что хотел решить )))

мне надо посчитать к примеру все Low по определенной цене за определенный период

для этого я взял массив , но т.к. в индекс массива можно всунуть только int , то я цену умножил на 5-знаке - на 100000 и нормализовал чтоб получить int значение и потом пройдясь по истории где получался такой же int индекс для массива записал +1

мне нужно было чтобы ту что я вижу цену на графике чтобы ту же он потом и отмечал в массиве а не с допуском в 1 пп - хз как тут округление сработает, как то не подумал про него , посмотрю

спасибо за ответы )

 
Slava:

NormalizeDouble - это очень дорогая функция. Дороже, чем простое округление. Проверьте профилировщиком. Используйте только для получения цены. В обычной жизни старайтесь избегать NormalizeDouble

побольше бы таких советов

Причина обращения: