Он ожидает, что функция MathMin() будет детерминированной. Таким образом, чтобы всегда давать один и тот же результат, когда два аргумента одинаковы. И не разный результат в зависимости от того, какой аргумент первый или второй.
fxsaber прав, это проблема.
аaa..., тогда зачем так было запутывать про " Математически одинаковое выражение (выделено)" и union достаточно было:
In C++, for example returns . The expression is true, but the bits are different. What is the purpose of having something like which should be but is represented differently? Is used exactly the same way as in any computations?
Отлично разбираюсь в вопросе, поэтому написал оба варианта MathMin, чтобы показать, что математически одинаковые функции в языках программирования выдают неодинаковые результаты.
template <typename T>
T ToType( constdouble Num )
{
union UNION
{
T Num1;
double Num2;
} Union;
Union.Num2 = Num;
return(Union.Num1);
}
voidOnStart()
{
Print(ToType<long>(MathMin(-0.0, 0.0))); // 0Print(ToType<long>(MathMin(0.0, -0.0))); // -9223372036854775808
}
Кажись баг.
На С++ работает нормально:
#include <iostream>
using namespace std;
//template <typename T>
T ToType(constdouble Num)
{
union UNION
{
T Num1;
double Num2;
} Union;
Union.Num2 = Num;
return(Union.Num1);
}
//int main()
{
double positive_zero_val, negative_zero_val;
positive_zero_val = 0.0;
negative_zero_val = -0.0;
//---long long_negative_zero_val = ToType<long>(negative_zero_val);
printf("\nLong negative zero = %d", long_negative_zero_val);
cin.get();
}
в консоли:
Long negative zero = 0
Вопрос попутно к разработчикам. Это нормально, что в окне отладки переменная Union не разварачивается и совсем не реагирует на клик?
Вручную добавлены поля Union.Num1 и Union.Num2. Хотя бы так видны значения...
//+------------------------------------------------------------------+//| Returns the bit representation corresponding to a double value . |//+------------------------------------------------------------------+long DoubleToLongBits(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl;
dbl.value = value;
return dbl.bits;
}
or the shorter version
long DoubleToLongBits(constdoublevalue)
{
union _d {doublevalue; long bits;} dbl = { value };
return dbl.bits;
}
Он ожидает, что функция MathMin() будет детерминированной. Таким образом, чтобы всегда давать один и тот же результат, когда два аргумента одинаковы. И не разный результат в зависимости от того, какой аргумент первый или второй.
fxsaber прав, это проблема.
аaa..., тогда зачем так было запутывать про " Математически одинаковое выражение (выделено) " и union
достаточно было:
но т.к. 0.0 == -0.0, тогда не могу представить ситуацию, когда это может быть проблемой и, вообще на что-то повлиять
старинная особенность Min/Max в MQL - они работают так как считают разработчики, то есть верно :-)
это стандарты ошибаются
аaa..., тогда зачем так было запутывать про " Математически одинаковое выражение (выделено) " и union
достаточно было:
но т.к. 0.0 == -0.0, тогда не могу представить ситуацию, когда это может быть проблемой и, вообще на что-то повлиять
если бы это был не ноль, тогда это была бы проблема. А при нуле ни на что не влияет.
Ибо:
c++ - What is the difference between -0 and 0? - Stack Overflow
Поэтому, все что нужно знать, это то, что 0 = -0
Вот и вся особенность, которая не влияет на вычисления и логику
Отлично разбираюсь в вопросе, поэтому написал оба варианта MathMin, чтобы показать, что математически одинаковые функции в языках программирования выдают неодинаковые результаты.
Кажись баг.
На С++ работает нормально:
в консоли:
Long negative zero = 0Вопрос попутно к разработчикам. Это нормально, что в окне отладки переменная Union не разварачивается и совсем не реагирует на клик?
Вручную добавлены поля Union.Num1 и Union.Num2. Хотя бы так видны значения...
Works as expected! The first bit (bit index 0) is the sign bit which is set for -0.0.
These are also more special cases in ieee 754 format. https://www.wikiwand.com/en/IEEE%20754#Special_values
Кажись баг.
На С++ работает нормально:
в консоли:
нет никакого бага. В С++ тоже самое.
просто ошиблись с форматированием и с типом
попробуйте так:
In the same context, this can examine the 64 bit representation of doubles https://www.mql5.com/en/code/20822
or the shorter version
нет никакого бага. В С++ тоже самое.
просто ошиблись с форматированием и с типом
попробуйте так:
Да, я поторопился. Спасибо за науку ))
Иногда нужно быстро поместить советник в Тестер. Можно сделать так.
Выбрать дату в будущем и нажать CTRL+F5 в ME.