Кто-нибудь еще сталкивался с такими числами при запуске стратегий в тестере? -1.000000000006551e-005 и 1.000000000006551e-005 (ага, одиннадцать нулей). Это должен быть определенный тип двойного формата, но какой тип двойного формата, хм?
Также, я читаю документацию по MQL5, вроде да, хорошо, хорошо, стандартный тип данных int имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647, тогда да, конечно, есть тип данных unsigned int с минимальным значением 0 и максимальным значением 4 294 967 295 НО ;) нет типа данных int с минимальным значением минус -4 294 967 295и максимальным значением0. Я бы подумал, что должен быть тип данных int с такими минимальным и максимальным значениями, но это то, что есть. Предыдущее утверждение может быть применимо и к другим типам данных.
Спасибо
0.00001 - это то же самое, что 1 e-5 - это формат экспоненты. Дополнительные цифры в конце, 6551 эквивалентны 0.00000000000000006551, и именно поэтому у нас возникают проблемы при сравнении двоек. . вам нужно прочитать это, и сделать некоторые исследования, если вам нужно, чтобы вы поняли, что происходит:Может ли цена != цена ?
RaptorUK: 0.00001 - это то же самое, что 1 e-5 - формат экспоненты. Дополнительные цифры в конце, 6551, эквивалентны 0.00000000000000006551, и именно поэтому у нас проблемы со сравнением двоек. . вам нужно прочитать это, и сделать некоторые исследования, если вам нужно, так что вы понимаете, что происходит:Может ли цена != цена?
Саймон,
Премного благодарен, я читаю эту тему и полагаю, что общее решение для двойного сравнения, предложенное участниками темы mql4, заключалось в том, чтобы найти и использовать метод округления этих двоек, чтобы вернуть правильные значения. Что вы скажете на это?
Премного благодарен, я читаю эту тему и полагаю, что общее решение для двойного сравнения, предложенное участниками темы mql4, заключалось в том, чтобы найти и использовать метод округления этих двоек, чтобы вернуть правильные значения. Что вы скажете по этому поводу?
Спасибо
В контексте вашего сообщения выше сравнение двоек не важно, важно понять, почему вы не можете просто сравнить двойки.
RaptorUK: В контексте вашего сообщения выше сравнение двоек не важно, важно понять, почему нельзя просто сравнить двойки.
Почему? Потому что я думаю, что ценовые значения возвращаются в формате четырех и пяти цифр (с исключениями вроде USDJPY, которая возвращает ценовые значения из двух и трех цифр). Я постараюсь просто разложить это раз и навсегда, потому что я не хочу затягивать это дольше, чем нужно.
Цена предложения USDCHF в настоящее время составляет 0,92909, и я полагаю, что MetaTrader5 вычисляет эти значения цены на самом дальнем расстоянии - шестнадцать мест справа от десятичной дроби, если это так, то одиннадцать мест после последней цифры девять будут брошены в расчеты цены USDCHF 0,9290900000000000. Я думаю, что причина, по которой двойники нельзя просто сравнить, заключается в том, что остальные места справа от десятичной дроби цены (не те, которые читаются в терминале, а те, которые не читаются в терминале) вызывают проблемы неравенства.
Почему? Потому что я думаю, что значения цены возвращаются в формате четырех и пяти цифр (за исключением USDJPY, которая возвращает значения цены из двух и трех цифр). Я постараюсь просто разложить это раз и навсегда, потому что я не хочу затягивать это дольше, чем нужно.
Цена предложения USDCHF в настоящее время составляет 0,92909, и я полагаю, что MetaTrader5 вычисляет эти значения цены на самом дальнем расстоянии - шестнадцать мест справа от десятичной дроби, если это так, то одиннадцать мест после последней цифры девяти отбрасываются при вычислении цены USDCHF 0,9290900000000000. Я думаю, что причина, по которой двойные значения нельзя просто сравнить, заключается в том, что остальные места справа от десятичной дроби цены (не те, которые читаются в терминале, а те, которые не читаются в терминале) создают проблему неравенства.
Спасибо
Проблема с двойными числами возникает из-за их двоичного представления. Есть двойки, которые не имеют точного двоичного представления, поэтому получаются такие вещи, как 1.000000000006551e-005. Я не вдаюсь в подробные объяснения, если интересно, можете почитать, например, это.
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
Все объясняется на первой странице темы, на которую я дал ссылку, по сути; значение 1.57373 может храниться как двойное значение 1.5737300000000001, а NormalizeDouble(1.57373, 5) может дать двойное значение 1.5737299999999999 оба значения, округленные до ближайшей 5-й цифры, равны, но при прямом сравнении не равны ... это то, как хранятся двойные значения, они являются числами с плавающей запятой (посмотрите на числа с плавающей запятой, прочитайте и поймите) и часто хранимое значение не совсем то же самое, что значение, которое, как вы думаете, хранится.
Поэтому в вашем комментарии показано вычитание двух двоек, и вы видите разницу как 1.0000000000xyz -e5, потому что именно так хранятся двойные значения - числа с плавающей точкой.
Floating point representations vary from machine to machine, as I've implied. Fortunately one is by far the most common these days: the IEEE-754 standard. This standard is prevalent enough that it's worthwhile to look at it in depth; chances are good you'd be able to use this information on your platform (look for ieee754.h). An IEEE-754...
angevoyageur: Проблема с двойками возникает из-за их двоичного представления. Есть двойки, которые не имеют точного двоичного представления, поэтому получаются такие вещи, как 1.000000000006551e-005. Я не вдаюсь в подробное объяснение, если интересно, можете почитать вот это, например.
1.000000000006551e-005 на шестнадцатом месте справа от десятичной дроби - e-005.
Вы хотите сказать, что 1.000000000006551e-005 не имеет точного двоичного представления, потому что его шестнадцатое место справа от десятичной дроби не целое число, а e-005?
"Я не вдаюсь здесь в подробные объяснения".
Почему нет? Если вы хотите написать подробное объяснение, то, конечно, сделайте это.
"Если интересно, вы можете прочитать это для примера".
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
Почему? Если вы хотите написать подробное объяснение, то, конечно, сделайте это.
Помните, мы обсуждали основные фундаментальные вещи, которые вы должны знать, если хотите уметь правильно кодировать? Числа с плавающей запятой - одна из них...ДОР, там есть много информации, найдите ее, прочитайте, поймите ее, тогда вы сможете кодировать немного лучше.
Шестнадцатое место справа от десятичной дроби в 1.000000000006551e-005 - это e-005.
Вы хотите сказать, что 1.000000000006551e-005 не имеет точного двоичного представления, потому что его шестнадцатое место справа от десятичной дроби не целое число, а e-005?
Нет. Если бы вы прочитали мою ссылку и/или ссылку RaptorUK, это было бы более ясно для вас. Если нет, прочитайте еще раз :-D
1.000000000006551e-005 - это просто другое обозначение для 0.00001000000000006551.
Все объясняется на первой странице темы, на которую я дал ссылку, по сути; значение 1.57373 может храниться как двойное значение 1.5737300000000001, а NormalizeDouble(1.57373, 5) может дать двойное значение 1.5737299999999999 оба значения, округленные до ближайшей 5-й цифры, равны, но при прямом сравнении не равны ... это то, как хранятся двойные значения, они являются числами с плавающей запятой (посмотрите на числа с плавающей запятой, прочитайте и поймите) и часто хранимое значение не совсем то же самое, что значение, которое, как вы думаете, хранится.
Так, в вашем комментарии показано вычитание двух двоек, и вы видите разницу как 1.00000000000000xyz -e5, потому что именно так хранятся двойные значения - числа с плавающей запятой.
1.57373 (игнорировать)
1.5737300000000001
1.5737299999999999
"Оба значения, округленные до ближайшего 5-го знака, равны"
Оба значения, округленные до ближайшего 5-го знака, равны 1,57373.
"но сравниваемые напрямую не равны"
Да, потому что есть разница.
"так хранятся двойные значения"
Двойные значения, такие как 1.5737300000000001, хранятся как 1.57373 (если используется normalize double, я полагаю). Если normalize double не используется, то двойное значение 1.5737300000000001 сохранит этот формат значения, правильно?
"и часто хранимое значение не совсем совпадает с тем значением, которое, как вы думаете, хранится".
Мое последнее утверждение отвечает и на это утверждение.
Я прочитаю ссылку, которую вы предоставили, спасибо за нее.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Здравствуйте сообщество MQL5,
Кто-нибудь еще сталкивался с такими числами при запуске стратегий в тестере? -1.000000000006551e-005 и 1.000000000006551e-005 (ага, одиннадцать нулей). Это должен быть определенный тип двойного формата, но какой тип двойного формата, хм?
Также, я читаю документацию по MQL5, вроде да, хорошо, хорошо, стандартный тип данных int имеет минимальное значение -2 147 483 648 и максимальное значение 2 147 483 647, тогда да, конечно, есть тип данных unsigned int с минимальным значением 0 и максимальным значением 4 294 967 295 НО ;) нет типа данных int с минимальным значением минус -4 294 967 295 и максимальным значением 0. Я бы подумал, что должен быть тип данных int с такими минимальным и максимальным значениями, но это то, что есть. Предыдущее утверждение может быть применимо и к другим типам данных.
Спасибо
0.00001 - это то же самое, что 1 e-5 - формат экспоненты. Дополнительные цифры в конце, 6551, эквивалентны 0.00000000000000006551, и именно поэтому у нас проблемы со сравнением двоек. . вам нужно прочитать это, и сделать некоторые исследования, если вам нужно, так что вы понимаете, что происходит:Может ли цена != цена?
Саймон,
Премного благодарен, я читаю эту тему и полагаю, что общее решение для двойного сравнения, предложенное участниками темы mql4, заключалось в том, чтобы найти и использовать метод округления этих двоек, чтобы вернуть правильные значения. Что вы скажете на это?
Спасибо
Саймон,
Премного благодарен, я читаю эту тему и полагаю, что общее решение для двойного сравнения, предложенное участниками темы mql4, заключалось в том, чтобы найти и использовать метод округления этих двоек, чтобы вернуть правильные значения. Что вы скажете по этому поводу?
Спасибо
В контексте вашего сообщения выше сравнение двоек не важно, важно понять, почему нельзя просто сравнить двойки.
Почему? Потому что я думаю, что ценовые значения возвращаются в формате четырех и пяти цифр (с исключениями вроде USDJPY, которая возвращает ценовые значения из двух и трех цифр). Я постараюсь просто разложить это раз и навсегда, потому что я не хочу затягивать это дольше, чем нужно.
Цена предложения USDCHF в настоящее время составляет 0,92909, и я полагаю, что MetaTrader5 вычисляет эти значения цены на самом дальнем расстоянии - шестнадцать мест справа от десятичной дроби, если это так, то одиннадцать мест после последней цифры девять будут брошены в расчеты цены USDCHF 0,9290900000000000. Я думаю, что причина, по которой двойники нельзя просто сравнить, заключается в том, что остальные места справа от десятичной дроби цены (не те, которые читаются в терминале, а те, которые не читаются в терминале) вызывают проблемы неравенства.
Спасибо
Почему? Потому что я думаю, что значения цены возвращаются в формате четырех и пяти цифр (за исключением USDJPY, которая возвращает значения цены из двух и трех цифр). Я постараюсь просто разложить это раз и навсегда, потому что я не хочу затягивать это дольше, чем нужно.
Цена предложения USDCHF в настоящее время составляет 0,92909, и я полагаю, что MetaTrader5 вычисляет эти значения цены на самом дальнем расстоянии - шестнадцать мест справа от десятичной дроби, если это так, то одиннадцать мест после последней цифры девяти отбрасываются при вычислении цены USDCHF 0,9290900000000000. Я думаю, что причина, по которой двойные значения нельзя просто сравнить, заключается в том, что остальные места справа от десятичной дроби цены (не те, которые читаются в терминале, а те, которые не читаются в терминале) создают проблему неравенства.
Спасибо
Почему?
Все объясняется на первой странице темы, на которую я дал ссылку, по сути; значение 1.57373 может храниться как двойное значение 1.5737300000000001, а NormalizeDouble(1.57373, 5) может дать двойное значение 1.5737299999999999 оба значения, округленные до ближайшей 5-й цифры, равны, но при прямом сравнении не равны ... это то, как хранятся двойные значения, они являются числами с плавающей запятой (посмотрите на числа с плавающей запятой, прочитайте и поймите) и часто хранимое значение не совсем то же самое, что значение, которое, как вы думаете, хранится.
Поэтому в вашем комментарии показано вычитание двух двоек, и вы видите разницу как 1.0000000000xyz -e5, потому что именно так хранятся двойные значения - числа с плавающей точкой.
Проблема с двойками возникает из-за их двоичного представления. Есть двойки, которые не имеют точного двоичного представления, поэтому получаются такие вещи, как 1.000000000006551e-005. Я не вдаюсь в подробное объяснение, если интересно, можете почитать вот это, например.
1.000000000006551e-005 на шестнадцатом месте справа от десятичной дроби - e-005.
Вы хотите сказать, что 1.000000000006551e-005 не имеет точного двоичного представления, потому что его шестнадцатое место справа от десятичной дроби не целое число, а e-005?
"Я не вдаюсь здесь в подробные объяснения".
Почему нет? Если вы хотите написать подробное объяснение, то, конечно, сделайте это.
"Если интересно, вы можете прочитать это для примера".
Я начал читать.
Спасибо.
"Я не вхожу сюда с подробными объяснениями".
Почему? Если вы хотите написать подробное объяснение, то, конечно, сделайте это.
Шестнадцатое место справа от десятичной дроби в 1.000000000006551e-005 - это e-005.
Вы хотите сказать, что 1.000000000006551e-005 не имеет точного двоичного представления, потому что его шестнадцатое место справа от десятичной дроби не целое число, а e-005?
Нет. Если бы вы прочитали мою ссылку и/или ссылку RaptorUK, это было бы более ясно для вас. Если нет, прочитайте еще раз :-D
1.000000000006551e-005 - это просто другое обозначение для 0.00001000000000006551.
Все объясняется на первой странице темы, на которую я дал ссылку, по сути; значение 1.57373 может храниться как двойное значение 1.5737300000000001, а NormalizeDouble(1.57373, 5) может дать двойное значение 1.5737299999999999 оба значения, округленные до ближайшей 5-й цифры, равны, но при прямом сравнении не равны ... это то, как хранятся двойные значения, они являются числами с плавающей запятой (посмотрите на числа с плавающей запятой, прочитайте и поймите) и часто хранимое значение не совсем то же самое, что значение, которое, как вы думаете, хранится.
Так, в вашем комментарии показано вычитание двух двоек, и вы видите разницу как 1.00000000000000xyz -e5, потому что именно так хранятся двойные значения - числа с плавающей запятой.
1.57373 (игнорировать)
1.5737300000000001
1.5737299999999999
"Оба значения, округленные до ближайшего 5-го знака, равны"
Оба значения, округленные до ближайшего 5-го знака, равны 1,57373.
"но сравниваемые напрямую не равны"
Да, потому что есть разница.
"так хранятся двойные значения"
Двойные значения, такие как 1.5737300000000001, хранятся как 1.57373 (если используется normalize double, я полагаю). Если normalize double не используется, то двойное значение 1.5737300000000001 сохранит этот формат значения, правильно?
"и часто хранимое значение не совсем совпадает с тем значением, которое, как вы думаете, хранится".
Мое последнее утверждение отвечает и на это утверждение.
Я прочитаю ссылку, которую вы предоставили, спасибо за нее.
Спасибо