¿Por qué hay tantos trucos con los títulos? - página 2

 
Roman:

-0,2 no es cero para devolver un error de división por cero.

La función devuelve -nan, es decir, No es un número. y el error se lanza al intentar dividir por -nan. En todo caso, el texto de error no es apropiado.

 

Solución correcta: la solución está en el dominio complejo.


Pero si estamos hablando de tener diferentes ramas de soluciones para parámetros de entrada positivos y negativos, sólo tenemos que definir estas ramas primero:

.

Haz tal característica y estarás bien. ;)
 
Andrey Azatskiy:

La función devuelve -nan, es decir, No es un número. y se produce un error al intentar dividir por -nan. En todo caso, el texto de error no es apropiado.

¿Por qué el -0,2 sería -nan?)

Otra función de prueba

En la calculadora.

1/(-3 ^ 3)

-27

En las funciones mql

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

-0.03703703703703703
 
Roman:

Entonces, ¿por qué el -0,2 es un nan)?

Otra función de prueba

En una calculadora

En una función mql.

no es -0,2 - nan, sino el resultado de un aumento de grados.
El grado fraccionario de un número (a^m/n) es la raíz de grado n de a^m.
Si el valor de la sub-raíz es negativo, puede ser negativo o positivo, en función de la potencia de m y del propio número a (que en mi problema es siempre negativo, por lo que es positivo para la potencia positiva de m y negativo para la negativa). Por lo tanto, si el valor de la sub-raíz es negativo, entonces el número también es negativo. La raíz de un número negativo se encuentra en el área compleja, por lo que no podemos operar con valores del área compleja a travésdel tipo habitualdouble, por lo que la implementación estándar de degree da -nan.

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

Solución correcta: la solución está en el dominio complejo.


Pero si estamos hablando de tener diferentes ramas de soluciones para parámetros de entrada positivos y negativos, entonces sólo tenemos que definir estas ramas primero:

.

Haz una función así y todo irá bien. ;)

Gracias por su detallada respuesta. Pero para mí el cálculo complejo no es adecuado para mi problema, así que lo más probable es que me limite a los números naturales y como resultado no caeré en el dominio complejo.

 
Andrey Azatskiy:

Gracias por su detallada respuesta. Pero para mí el cálculo complejo no es adecuado para mi problema, así que probablemente me limitaré a los números naturales y como resultado no caeré en el área compleja.

A eso me refiero, y específicamente te mostré un ejemplo. Míralo con atención. Este ejemplo es exactamente para su caso.

zy

traducir a µl es muy fácil

 
Andrey Azatskiy:

no es -0,2 - nan, sino el resultado de un grado.
La potencia de un número fraccionario (a^m/n) es la raíz de grado n de a^m.
Si el valor de la sub-raíz es negativo, puede ser negativo o positivo en función de la potencia de m y del propio número a (que en mi problema es siempre negativo, por lo que es positivo a potencia m positiva y negativo a negativa). Por lo tanto, si el valor de la sub-raíz es negativo, entonces el número también es negativo. La raíz de un número negativo se encuentra en el área compleja, por lo que no podemos operar con valores del área compleja a través del tipo habitual double, por lo que la implementación estándar de degree da -nan.

Andrey, sí, me expresé mal, está claro que el resultado de elevar a una potencia devuelve -nan.
Pero este resultado da lugar a una potencia fraccionaria, donde el entero es cero -0,2
La calculadora calcula todo correctamente.

Y la prueba anterior, también, no cuenta como en la calculadora.

 
Олег avtomat:

A eso me refiero, y te he puesto específicamente un ejemplo. Mira bien.

Sí, lo tengo. Gracias. (incluso la fórmula está escrita)

 
Andrey Azatskiy:

¿Quizás las patas surgen del hecho de que no se puede sacar una raíz par de un número negativo? Ya estoy un poco confundido... Y lo más importante, ¿cómo evitarlo?

Los grados enteros se determinan simplemente mediante la multiplicación (y tomando la inversa para los exponentes negativos), por lo que pueden transferirse fácilmente a las bases negativas. Los grados fraccionarios se definen mediante el logaritmo y el exponente: y^x=exp(x*ln(y)) y con los números negativos llegan al plano complejo. El logaritmo tiene un número infinito de ramas y para evitar la molestia de encontrar la rama correcta, devuelven NAN.

 
Andrey Azatskiy:

Gracias por tu respuesta, pero en general si tomamos una solución aritméticamente correcta, parece que sólo se pueden utilizar números complejos para implementar dicha solución... En su método propuesto es necesario romper el grado para que el valor subyacente tenga siempre un grado positivo y la respuesta sea siempre positiva. Pero si se prescinde de este encaje - llegamos sólo a los números complejos, porque según el modelo algebraico generalmente aceptado que yo conozco (no soy matemático de formación) - la raíz de un número negativo será un número complejo.

utilizar la fórmula que he sugerido más arriba.

Esta es la misma fórmula:

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);
  }

y aquí hay un ejemplo de cómo convertir un doble en una fracción

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...