Neden derecelerle böyle numaralar var?

 

Güçlerle çalışan bir işlev yazmam gerekiyordu ve yazma sürecinde kendim için ilginç bir şey keşfettim, yani:

Negatif bir kesirli sayıyı negatif bir kesirli kuvvetle değiştirirseniz, MQL5 -nan yazar.

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

Aynı sonucu aldığım yerde C++'a baktım (Derlemeye çok tembel olduğum için dilin hangi sürümünün kullanıldığını bilmiyorum ve cpp.sh üzerinde çabucak test ettim)

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

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


Artılarda, aynı cevabı veriyor, o zaman MQL5'te kesinlikle hata yok! Ama soru şu ki, bu neden oluyor? Matematiğe dönersek, cevap şu olmalıdır. Matematiksel olarak, bir sayının eksi bir kuvveti, aynı sayının artı bir kuvvete bölünmesine eşittir. Başka bir deyişle:

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

Ve bilgisayardaki hesap makinesi bunu doğrular. Peki derecelerle ilgili bu numara tam olarak nedir?

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

Güçlerle çalışan bir işlev yazmam gerekiyordu ve yazma sürecinde kendim için ilginç bir şey keşfettim, yani:

Negatif bir kesirli sayıyı negatif bir kesirli kuvvetle değiştirirseniz, MQL5 -nan yazar.

Aynı sonucu aldığım yerde C++'a baktım (Derlemeye çok tembel olduğum için dilin hangi sürümünün kullanıldığını bilmiyorum ve cpp.sh üzerinde çabucak test ettim)


Artılarda, aynı cevabı veriyor, o zaman MQL5'te kesinlikle hata yok! Ama soru şu ki, bu neden oluyor? Matematiğe dönersek, cevap şu olmalıdır. Matematiksel olarak, bir sayının eksi bir kuvveti, aynı sayının artı bir kuvvete bölünmesine eşittir. Başka bir deyişle:

Ve bilgisayardaki hesap makinesi bunu doğrular. Peki derecelerle ilgili bu numara tam olarak nedir?

R'de:

(-5.5)^-0.2=NaN

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

 
Aleksey Nikolayev :

R'de:

(-5.5)^-0.2=NaN

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

Belki de bacaklar, negatif bir sayıdan eşit bir kök almanın imkansız olduğu gerçeğinden büyür? Zaten biraz kafam karıştı ... Ve en önemlisi, bu nasıl aşılır?

 
Andrey Azatskiy :

Ve en önemlisi, bu nasıl aşılır?

m = 2

sayı = 10

 double result = pow ( pow (- 5.5 , 2.0 ),- 0.1 ); 
Print ( "result = " ,result);                       //result = 0.7110947333604484
parantez olmadan, eksi işareti farklı yorumlanabilir, IMHO
 
Roman :

İşaretlerle ilgili bir sorun olacak. Eşit bir gücün kökü her zaman pozitiftir

 
Andrey Azatskiy :

İşaretlerle ilgili bir sorun olacak. Eşit bir gücün kökü her zaman pozitiftir

Derecenin kesirli olduğu hesap makinesinde

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

Derecenin kesirli olduğu mql cinsinden

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

zero divide in 'Pow.mq5' 

Derecenin tamsayı olduğu mql'de

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

- 27.0

Sonuç olarak, işlev kesirli gücü doğru bir şekilde hesaplamaz ve sıfır bölme döndürür.

 
Igor Makanu :

m = 2

sayı=10

parantez olmadan, eksi işareti farklı yorumlanabilir, IMHO

Cevabınız için teşekkür ederim, ancak genel olarak, aritmetik olarak doğru bir çözüm alırsanız, o zaman sadece karmaşık sayılarla benzer bir şey uygulamak mümkün olacak gibi görünüyor ... Önerdiğiniz yöntemde, dereceyi bölmeniz gerekiyor. kök değerinin her zaman pozitif bir dereceye sahip olduğu ve cevabın her zaman pozitif olacağıdır. Ama bu uydurma olmadan alırsak, o zaman sadece karmaşık sayılara geliriz, çünkü genel olarak kabul edilen cebirsel modele göre, bildiğim kadarıyla (eğitimden dolayı bir matematikçi değilim) - negatif bir sayının kökü karmaşık bir sayı.

 
Roman :

Derecenin kesirli olduğu hesap makinesinde

Derecenin kesirli olduğu mql cinsinden

Derecenin tamsayı olduğu mql'de

Sonuç olarak, işlev kesirli gücü doğru bir şekilde hesaplamaz ve sıfır bölme döndürür.

İşlev doğru. Sadece standart matematikle çalışmıyor.

 
Yanlış anladıysam düzeltin belki karmaşık sayıların dışında da bir çözüm vardır?
 
Andrey Azatskiy :

İşlev doğru. Sadece standart matematikle çalışmıyor.

-0.2, sıfıra bölme hatası döndürmek için sıfır değildir.

Neden: