Por que existem tais truques com graus? - página 2

 
Roman:

-0,2 não é zero para devolver uma divisão por erro zero.

A função retorna -nan, ou seja, Not a Number. e o erro é jogado quando se tenta dividir por -nan. Se alguma coisa, o texto de erro simplesmente não é apropriado.

 

Solução correta: A solução está no domínio complexo.


Mas se estamos falando de ter diferentes ramos de soluções para parâmetros de entrada positivos e negativos, só precisamos definir primeiro esses ramos:

.

Faça tal característica e você ficará bem ;)
 
Andrey Azatskiy:

A função retorna -nan, ou seja, Não é um Número. e um erro é lançado quando se tenta dividir por -nan. Se alguma coisa, o texto de erro simplesmente não é apropriado.

Por que diabos -0,2 seria -nan ?)

Outra função de teste

Em calculadora.

1/(-3 ^ 3)

-27

Em funções mql

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

-0.03703703703703703
 
Roman:

Então por que diabos é -0,2 uma nan?)

Outra função de teste

Em uma calculadora

Em uma função mql.

não é -0,2 - nan, mas o resultado de um aumento de grau.
O grau de fracionamento de um número (a^m/n) é a raiz do grau n de a^m.
Se o valor da sub-raiz for negativo, pode ser negativo ou positivo, com base na potência de m e no próprio número a (que no meu problema é sempre negativo, portanto é positivo na potência positiva de m e negativo na negativa). Portanto, se o valor da sub-raiz é negativo, então o número também é negativo. A raiz de um número negativo está na área complexa, por isso não podemos operar nos valores da área complexa atravésdo tipo duplo habitual, razão pela qual a implementação padrão de grau dá -nan.

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

Solução correta: a solução está no domínio complexo.


Mas se estamos falando de ter diferentes ramos de soluções para parâmetros de entrada positivos e negativos, então só precisamos definir primeiro esses ramos:

.

Faça tal característica e você ficará bem ;)

Obrigado por sua resposta detalhada. Mas para mim o cálculo complexo não é adequado para o meu problema, então o mais provável é que eu me limite a números naturais e, como resultado, não vou cair no domínio complexo.

 
Andrey Azatskiy:

Obrigado por sua resposta detalhada. Mas para mim o cálculo complexo não é adequado para o meu problema, portanto, muito provavelmente me limitarei a números naturais e, como resultado, não vou cair na área complexa.

É disso que estou falando, e eu lhe mostrei especificamente um exemplo. Olhe com cuidado. Este exemplo é exatamente para o seu caso.

zy

Traduzir para µl é muito fácil

 
Andrey Azatskiy:

não é -0,2 - nan, mas o resultado de um grau.
O poder de um número fracionário (a^m/n) é a raiz do grau n de a^m.
Se o valor da sub-raiz for negativo, pode ser negativo ou positivo com base na potência m e no próprio número a (que no meu problema é sempre negativo, portanto é positivo na potência m positiva e negativo na negativa). Portanto, se o valor da sub-raiz é negativo, então o número também é negativo. A raiz de um número negativo está na área complexa, por isso não podemos operar com valores da área complexa através do tipo duplo habitual, razão pela qual a implementação padrão de grau dá -nan.

Andrey, sim, eu falei mal, é claro que o resultado de elevar a um poder retorna -nan.
Mas este resultado dá origem a um poder fracionário, onde o número inteiro é zero -0,2
A calculadora calcula tudo corretamente.

E o teste anterior, também, não conta como na calculadora.

 
Олег avtomat:

É disso que estou falando, e eu dei especificamente um exemplo. Dê uma boa olhada.

Sim, eu entendi. Obrigado. (até a fórmula está anotada)

 
Andrey Azatskiy:

Talvez as pernas cresçam do fato de que não se pode tirar uma raiz sequer de um número negativo ? Eu já estou um pouco confuso... E o mais importante, como contornar isso ?

Os graus inteiros são determinados simplesmente pela multiplicação (e levando o inverso para expoentes negativos), portanto, são facilmente transferidos para bases negativas. Os graus fracionários são definidos via logaritmo e expoente: y^x=exp(x*ln(y)) e com números negativos chegam ao plano complexo. O logaritmo tem um número infinito de ramos e para evitar o incômodo de encontrar o ramo certo, eles devolvem a NAN.

 
Andrey Azatskiy:

Obrigado por sua resposta, mas em geral se tomarmos uma solução aritmeticamente correta, parece que apenas números complexos podem ser usados para implementar tal solução... Em seu método proposto, é necessário quebrar o grau para que o valor subjacente tenha sempre um grau positivo e a resposta será sempre positiva. Mas se você tomar sem este ajuste - chegamos apenas a números complexos, na verdade de acordo com o modelo algébrico geralmente aceito como eu sei (não sou matemático por educação) - a raiz de um número negativo será um número complexo.

usar a fórmula que sugeri acima.

Aqui está a mesma 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);
  }

e aqui está um exemplo de como converter um duplo em uma fração

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...
Razão: