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

 
Roman:

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

Функция возвращает -nan, т.е. Not a Number. а ошибка кидается при попытке поделить на -nan. Если на то пошло то просто текст ошибки неподходящий.

 

Правильное решение:     решение находится в комплексной области.


Но если речь идёт том, чтобы иметь разные ветви решений для положительных и отрицательных входных параметров, то надо просто для начала эти ветви определить:

 

.

Сделай такую функцию и всё будет хорошо.  ;)
 
Andrey Azatskiy:

Функция возвращает -nan, т.е. Not a Number. а ошибка кидается при попытке поделить на -nan. Если на то пошло то просто текст ошибки неподходящий.

Так а c какого фига -0.2 это -nan ?  :))

Ещё тест функции

В калькуляторе

1/(-3 ^ 3)

-27

В mql функции

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

-0.03703703703703703
 
Roman:

Так а c какого фига -0.2 это nan ?  :))

Ещё тест функции

В калькуляторе

В mql функции

не -0,2 - nan, а результат возведения в степень. 
Дробная степень числа (а^m/n) - это корень n степени из a^m. 
Если подкоренное значение - отрицательно будет, а оно может быть как отрицательным, так и положительным исходя из степени m ну и самого числа a (которое в моей задачи всегда отрицательно, по этому при положительной степени m оно положительно а при отрицательной  - отрицательно). Так вот если подкоренное значение отрицательно то и число тоже отрицательное. Корень из отрицательного числа - лежит в комплексной области, а посему мы не можем оперировать значениями комплексной области через обычный тип double и из за этого стандартная реализация степени - выдает -nan.

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Олег avtomat:

Правильное решение:     решение находится в комплексной области.


Но если речь идёт том, чтобы иметь разные ветви решений для положительных и отрицательных входных параметров, то надо просто для начала эти ветви определить:

 

.

Сделай такую функцию и всё будет хорошо.  ;)

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

 
Andrey Azatskiy:

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

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

зы

перевести на мкл очень просто

 
Andrey Azatskiy:

не -0,2 - nan, а результат возведения в степень. 
Степень дробного числа (а^m/n) - это корень n степени из a^m. 
Если подкоренное значение - отрицательно будет, а оно может быть как отрицательным, так и положительным исходя из степени m ну и самого числа a (которое в моей задачи всегда отрицательно, по этому при положительной степени m оно положительно а при отрицательной  - отрицательно). Так вот если подкоренное значение отрицательно то и число тоже отрицательное. Корень из отрицательного числа - лежит в комплексной области, а посему мы не можем оперировать значениями комплексной области через обычный тип double и из за этого стандартная реализация степени - выдает -nan.

Андрей, да, не так выразился, это понятно что результат возведения в степень возвращает -nan.
Но порождает этот результат, дробная степень, где целое число является нулём -0.2
Калькулятор же правильно всё считает.

И предыдущий тест, тоже не так считает как в калькуляторе.

 
Олег avtomat:

Так об этом я и говорю, и специально показал пример. Внимательно посмотри.

 да, все понял. благодарю. (даже формула готовая написана)

 
Andrey Azatskiy:

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

Целые степени определяются просто через перемножение (и взятие обратного для отрицательных показателей), поэтому легко переносятся на отрицательные основания. Дробные степени определяются через логарифм и экспоненту: y^x=exp(x*ln(y)) и с отрицательными числами выходим в комплексную плоскость. У логарифма бесконечное число ветвей и чтобы не заморачиваться с поиском подходящей ветви, возвращают NAN. 

 
Andrey Azatskiy:

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

считайте по формуле, что я Выше предложил

вот один в один по формуле:

void OnStart()
  {
   int m = 2;
   int n = 10;
   
   double result = 1.0/pow(pow(-5.5,m),1.0/n); 		// result = 0.7110947333604484
   Print("result = ",result);
  }

а вот пример  как double в дробь перевести

https://www.mql5.com/ru/forum/290279#comment_9396706

Число в дробь (convert double to fraction)
Число в дробь (convert double to fraction)
  • 2018.11.16
  • www.mql5.com
Ищу способ преобразовать вещественное число в дробь, нагуглил исходник https://stackoverflow...