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

 
Yurij Izyumov:

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

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

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

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

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

Вот я так и не понял в чём ваша задача.

Вы хотите преобразовать цену в int, чтобы его использовать как индекс массива, где будете посчитать количество одинаковых цен Low ?

Если да, то есть такие пары, например USDZAR, целая часть которого 14, вот сейчас 14.20112. Размер массива будет очень большой. Как вы собираетесь его использовать.

 

Есть такая константа:

DBL_EPSILON

Наименьшее число для которого выполняется условие 1.0+DBL_EPSILON != 1.0

2.2204460492503131e

 

Не нужен вам НормализДабл, выше уже верно сказали:

Print((string)(int)MathRound(1.31045/_Point));
Print((string)(int)MathRound(1.31044/_Point));

Кстати, НормализДабл примерно так работает:

(MathRound(1.31045/_Point))*_Point;
// когда в функцию передаём Digits
 
Petros Shatakhtsyan:

Вот я так и не понял в чём ваша задача.

Вы хотите преобразовать цену в int, чтобы его использовать как индекс массива, где будете посчитать количество одинаковых цен Low ?

Если да, то есть такие пары, например USDZAR, целая часть которого 14, вот сейчас 14.20112. Размер массива будет очень большой. Как вы собираетесь его использовать.

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

 

Как можно точнее переводить double в int ?

 Объявить переменную - string и через преобразование вписывать в нее результаты Ваших действий.

И что такое преобразовать точнее из double в int?! Не понятное явление народу. Все что будет после запятой будет не о-круг-лять-ся, а отбрасываться напрочь. Если у Вас была цена доубле 1.43534 то инт она будет - еденицей -1. И машина не математик, а выполняет то, что в нее заложено. А вот если бы Вы ей сказали, что число доубле 1.43534 надо преобразовать в число доубле с двумя знаками после запятой, то она Вам выдала 1.44 Надо понимать, что машина это не человек и она не будет догадываться наперед что Вам надо.
 
Yrii Kuksov:

 Объявить переменную - string и через преобразование вписывать в нее результаты Ваших действий.

А я такая одна стою в белом пальто?

 
Dmitry Fedoseev:

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

А зачем потерять 5-ый знак, может быть он нужен. Я так и не понял для чего этот массив и какая задача поставлена.

Но могу предложить другое.

Мы знаем верхний и нижний пределы цен (max+Q и min-Q), с каким-то запасом(Q).  Размер массива(size) будет (max+Q) - (min-Q), а индекс для обращения к массиву: index=size - (min-Q).

Т.е. идея в том, что если используется небольшой участок цен, то надо хранить в массиве только этот участок, а не с нуля.


А на счет преобразования double в int, я делаю так.  Если предположим, что количество знаков после запятой ровно 5 знаков, то можно написать так:


int a = 1.31045 + 0.000005; 

это конечно частный случай, но самый быстрый. И лучше написать несколько if, чем использовать тяжелые функции.

 
Dmitry Fedoseev:

А я такая одна стою в белом пальто?

Дмитрий здравствуйте. Скорей всего в черном. Я только еще учусь. Было время когда скачивал и исправлял предупреждения компилятора. И вот он предупреждения убрал, а логику нарушил: ни как из доубле не получится инт с дробью - ни как. 

И он там умножает что бы избежать это. Вот ему и надо использовать  переменную string .

Компиляция - Разработка программ - MetaTrader 5
Компиляция - Разработка программ - MetaTrader 5
  • www.metatrader5.com
Компиляция — это процесс перевода исходного кода MQL4/MQL5-программы на машинный язык. Ее результатом является создание исполняемого файла программы (*EX4 или *.EX5), который может быть запущен в торговой платформе. Скомпилировать можно любой файл (*.MQ4, *.MQ5 или *.MQH), однако исполняемый файл (*.EX4 или *.EX5) может быть получен только в...
 
Petros Shatakhtsyan:

А зачем потерять 5-ый знак, может быть он нужен. Я так и не понял для чего этот массив и какая задача поставлена.

Но могу предложить другое.

Мы знаем верхний и нижний пределы цен (max+Q и min-Q), с каким-то запасом(Q).  Размер массива(size) будет (max+Q) - (min-Q), а индекс для обращения к массиву: index=size - (min-Q).

Т.е. идея в том, что если используется небольшой участок цен, то надо хранить в массиве только этот участок, а не с нуля.


А на счет преобразования double в int, я делаю так.  Если предположим, что количество знаков после запятой ровно 5 знаков, то можно написать так:


int a = 1.31045 + 0.000005; 

это конечно частный случай, но самый быстрый. И лучше написать несколько if, чем использовать тяжелые функции.

Если нужен пяты знак, значит нужен, значит использовать. Тут никто не писал, что собирается использовать массив от нуля. Кажется несложно додуматься использовать массив размером с диапазон цены и вычислять индекс. Даже если сразу не додуматься - потом придется.

Простые, быстрые и частные случаи. Может в каких-то частных случаях и пойдет. Тут уже были попытки предложить свои быстрые альтернативные функции нормализации, но они, кажется успехом не закончились.

 
Yrii Kuksov:

Дмитрий здравствуйте. Скорей всего в черном. Я только еще учусь. Было время когда скачивал и исправлял предупреждения компилятора. И вот он предупреждения убрал, а логику нарушил: ни как из доубле не получится инт с дробью - ни как. 

И он там умножает что бы избежать это. Вот ему и надо использовать  переменную string .

Конечно можно преобразовать в строку, разобрать по знакам, всех их проанализировать, но это будет медленно работать. К тому же есть специализированные средства. 

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