Баг МТ4 - разработчикам посвящается - страница 2

 
Integer:


Почему так сразу кто-то виноват, а не я себе любимый? Надо правильно даблами пользоваться - MathFloor(NormalizeDouble(15.0*0.01/0.05,8));


Дмитрий, спасибо за единственный толковый ответ.

Прибавлять 0,000000001 к числу либо переводить в строковые и брать значение до запятой в голову приходило, но это непрофессионально.

Нормализовать до 8 знака помогает, хотя до конца не понятно, почему.

И навряд ли кто сможет детально, не отделываясь общими фразами, объяснить, почему.

Но, главное, работает :)

 
Andrey1979:


хотя до конца не понятно, почему.

И навряд ли кто сможет детально, не отделываясь общими фразами, объяснить, почему.

Если Вам непонятно почему и Вы не можете это доказать, то не надо было заявлять что это баг.

А если хотите детально, то пишите мне на почту.

.

.

.

.

.

.

.

P.S. это баг....

 
VBAG:

А вот так работает правильно:

Можно делать вывод где собака порылась....


0.00000000000001

== while((1.+eps)>1.) eps/=10.0; eps*=10.0;

Получите "машинное епсилон" для нужного типа данных ;)....

Удачи.

 
Andrey1979:

И навряд ли кто сможет детально, не отделываясь общими фразами, объяснить, почему.

Без обид - судя по тому, что этот вопрос возник, у Вас просто пока не хватит знаний это понять.

Не всегда 8 знаков - от типа данных зависит в общем случае. Просто все данные в мкл - это double, в мантиссе 15 значащих, а 8 знаков мантиссы - это, если верить разработчикам, максимальная точность, доступная для NormalizeDouble() - они код выкладывали для этой функции.

Удачи.

 

умно, НО

почему тогда результаты MathFloor(15/0.05*0.01) и MathFloor(15*0.01/0.05) отличаются?

Сначала ведь выполняется действие в скобках.

Именно здесь спрятана ошибка разработчиков, насколько я понимаю - в отличии результатов.

Есть что возразить?

И не пишите умное: "Получите "машинное епсилон" для нужного типа данных" или "если хотите детально, то пишите мне на почту".

Детально хочу, и не только я, так что выносите на всеобщее обозрение.

Думаю, многие меня поддержат.

PS. Только, пожалуйста, детально не только почему получен результат 2, а также почему результаты отличаются. Думаю, это будет сложнее! ;)

 
Andrey1979:

Думаю, многие меня поддержат.

Фи.

Если б ты думал не о поддержке (и, соответственно, победе), а о своей проблеме, ты бы и сам давно допёр.

Лечись от игромании, прежде чем лезть на форекс... ;-)

 

Да, и вот ещё что.

Поскольку вопрос задан не из-за желания поспорить, а исходя из необходимости решения реальной задачи,

просьба не только предлагать вариант ответа, почему результат MathFloor(15*0.01/0.05) неправильный,

а способ решения проблемы.

Пока что не прозвучало ничего более толкового, чем

MathFloor(NormalizeDouble(15.0*0.01/0.05,8));

Однако и это не полное решение, цитирую:

"Не всегда 8 знаков - от типа данных зависит в общем случае. Просто все данные в мкл - это double, в мантиссе 15 значащих, а 8 знаков мантиссы - это, если верить разработчикам, максимальная точность, доступная для NormalizeDouble() - они код выкладывали для этой функции."

Тем не менее, нам что, пользуясь MathFloor, чтобы не переживать о правильности результата, каждый раз подставлять NormalizeDouble(...,8) либо что-нибудь другое?

Разве это нельзя зашить сразу в MathFloor?

Это несложно, решить проблему MathFloor(15*0.01/0.05),

но ведь нет гарантии, что при подстановке других чисел не повторится та же самая ОШИБКА,

и не важно, с чем она связана, с "машинное епсилон", точностью промежуточного вычисления либо чем-нибудь ещё,

понимаете, о чём я говорю?

Ведь это важно, особенно когда дело касается больших депозитов.

А "умников", типа MetaDriver'a, не предлагающих решения, а только вносящих флуд, просьба не соваться.

 

Гхм. :)

Поскольку ветка посвящена разработчикам (разумеется чиста из миролюбия и любви к истине), позволь запинать тебя на месте,

патамушта я таки живу с ними в одном городе и, таким образом, мои патриотические чувства чувствуют себя оскорблёнными. ;)

// Заметь - моя патриотическая оскорблённость имеет право на существование ничуть не меньшее, чем твоя хамская уверенность в обязанности окружающих

// (и в особенности разработчиков) решить твою надуманную проблему, даже если это потребует переписывания операционной системы. ;)

// По крайней мере мои соображения и права не менее религиозны нежели твои. А может даже и более. ;-)

Проблема надумана, ибо притянута за уши именно её подача как "ошибка разработчиков", "баг".

Феномен существует, но при чём тут баги?

Устройство феномена имеет точно ту же природу как и переполнение байта при присваивании ему числа большего чем 255.

Оно чуть сложнее по структуре и не так хорошо описано (в силу распространённой тенденции разработчиков "не травмировать идиотов интелектуальными

излишествами в документации. ибо деньги платят, а потому всегда правы."), но по своей сути ничем не отличается.

Ну и?

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

И какого хера ты продолжаешь нести пургу, прикрываясь "заботой о великих депозитах глуповатых трейдеров"? ;)

Тебе решение надо? Так тебе (лично тебе) одно уже дали. Для твоего случая вполне подходит и будет работать безотказно.

Это замечательно, что ты так сильно хочешь позаботиться и о других идиотах. Только почему-то за чужой счёт.

Вот возьми да и сам позаботься. Напиши свой (безошибочный!) терминал.

Слабо?

// Вот меня всегда поражает и прямо таки восхищает, что вот в такие вот моменты у "поциентов" всегда (!) автоматически пальцы веером растопыриваются,

// и они потрясённо озираясь по сторонам безмолвно (но всё же громогласно) вопрошают "Это што!!????.. Это он, падла, мне предлагает рукава штоль засучить!!??... Самому МНЕ???? "

// :)

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

Но почему кто-то должен тебе это разжевать и положить в рот?

Давай уже дальше САМ. Тебе уже вполне достаточно здесь намекнули, как оно там устроено.

Даже для "самого ТЕБЯ". :) Дальше тебе вполне дожуют гугл и википедия.

Выздоравливай!

Аминь.

;)
 

Не. Чёйто путаешь. Я профиль правил только один раз. Давно. // Фотку вставлял.

:)

 
MetaDriver:

Не. Чёйто путаешь. Я профиль правил только один раз. Давно. // Фотку вставлял.

:)

Николаев или Херсон - не упомнил. ;)