О чего такие трюки со степенями бывают ?

 

Мне потребовалось написать функцию работающую со степенями и в процессе написания открыл для себя кое что интересное, а именно:

Если возмести отрицательное дробное число в отрицательную дробную степень, то MQL5 - пишет -nan. 

double n = MathPow(-5.5,-0.2);

Я проверил в C++ где тот же результат получил (не знаю какая версия языка использовалась, так как мне лень было компилировать и я по быстрому на cpp.sh протестил)

#include <iostream>
#include <string>
#include <tgmath.h>

int main()
{
    double _pow = pow(-5.5,-0.2);    
  
  std::cout << _pow << "\n";
}


Раз и в плюсах выдает тот же самый ответ то как бы в MQL5 точно нету ошибки! Но вопрос от чего так получается ? Если обратиться к математике то ответ должен быть. Математически число в отрицательной степени равняется единице делённой на это же число в положительной степени. Иными словами:

-5.5^-0.2 = 1/(-5.5^0.2) = −0,711094733;

И калькулятор на компьютере это подтверждает. Так в чем же собственно эта фишка со степенями кроется ?

 
double n = -1/MathPow(5.5, 0.2);
Print(n);
 
Andrey Azatskiy:

Мне потребовалось написать функцию работающую со степенями и в процессе написания открыл для себя кое что интересное, а именно:

Если возмести отрицательное дробное число в отрицательную дробную степень, то MQL5 - пишет -nan. 

Я проверил в C++ где тот же результат получил (не знаю какая версия языка использовалась, так как мне лень было компилировать и я по быстрому на cpp.sh протестил)


Раз и в плюсах выдает тот же самый ответ то как бы в MQL5 точно нету ошибки! Но вопрос от чего так получается ? Если обратиться к математике то ответ должен быть. Математически число в отрицательной степени равняется единице делённой на это же число в положительной степени. Иными словами:

И калькулятор на компьютере это подтверждает. Так в чем же собственно эта фишка со степенями кроется ?

в R:

(-5.5)^-0.2=NaN

-5.5^-0.2=-(5.5^-0.2)=-0.7110947

 
Aleksey Nikolayev:

в R:

(-5.5)^-0.2=NaN

-5.5^-0.2=-(5.5^-0.2)=-0.7110947

Возможно ноги растут от того что нельзя взять четный корень из отрицательного числа ? Я уже несколько запутался... И самое главное как обойти это ?

 
Andrey Azatskiy:

 И самое главное как обойти это ?

m = 2

n = 10

double result = pow(pow(-5.5,2.0),-0.1); 
Print("result = ",result);                      //result = 0.7110947333604484
без скобок знак минус можно по разному интерпретировать, имхо
 
Roman:

Тут со знаками проблема будет. Корень из четной степени всегда положителен 

 
Andrey Azatskiy:

Тут со знаками проблема будет. Корень из четной степени всегда положителен 

В калькуляторе где степень дробная

1/(-5.5 ^ -0.2)
-0,7110947333604484236326007791589

В mql где степень дробная

double n = 1/MathPow(-5.5, -0.2);
Print(n);

zero divide in 'Pow.mq5' 

В mql где степень целое

double n = 1/MathPow(-3.0, -3.0);
Print(n);

-27.0

Вывод, функция не правильно считает дробную степень, и возвращает zero divide.

 
Igor Makanu:

m = 2

n = 10

без скобок знак минус можно по разному интерпретировать, имхо

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

 
Roman:

В калькуляторе где степень дробная

В mql где степень дробная

В mql где степень целое

Вывод, функция не правильно считает дробную степень, и возвращает zero divide.

Функция верна. Там просто стандартная математика не подходит)

 
Если я не так понял то поправьте, быть может все таки существует решение вне комплексных чисел ? 
 
Andrey Azatskiy:

Функция верна. Там просто стандартная математика не подходит)

-0.2 это не ноль, чтобы возвращать ошибку деления на ноль.