|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
|
[C#] funzione per potenze con base negativa ed esponente non intero
Salve.
La funzione Math.Pow() se utilizzata con una base negativa ed un esponente non intero ritorna NaN. Vorrei sapere se esiste una funzione bult-in che invece riesce risolvere correttamente questo tipo di potenze? Mi sembra strano che (-8)^(1/3) così difficile da risolvere.
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
La funzione x^y, per qualsiasi x<0 non e' continua in R. Non esiste per tutto il dominio, e non e' nemmeno continua a tratti. E' una brutta bestia tutta sparsa.
-8^1/2 non si puo' fare. -8^1/3 si puo' fare -8^(72/213) si puo' fare -8^1/Sqrt(2) men che meno si puo' fare. -8^1/e ancora di meno. A parte tutti i valori positivi di y, si puo' calcolare per ogni y€N-, piu' ogni y€ a/b tali che a e b siano entrambi interi e in piu' b sia dispari. Ti conviene passare da una funzione che cucini tale fattore e restituisca eventualmente il valore cercato quando i parametri in input siano corretti.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 06-12-2010 alle 20:40. |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Quote:
In questo caso ti ci vorrebbe un calcolatore che sfrutta un motore algebrico (cosa che fanno solo alcuni programmi come Derive o Microsoft Math), oppure nel tuo caso, ti ci vuole una funzione che esegua la radice N_esima di un numero. Oppure può anche andar bene un workaround, come questo: Codice:
public double potenza(double x, double y)
{
if (x < 0 && y < 1)
return (-Math.Pow(-x, y));
else
return Math.Pow(x, y);
}
Ultima modifica di Supdario : 06-12-2010 alle 21:07. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
|
Quote:
Grazie.
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Si, ma e' sbagliato.
-9 ^ (0.5) non e' -3.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
|
La mia intenzione è quella di creare una semplicissima funzione per risolvere una radice con indice maggiore di 2. Il parametro sarà quindi il radicando e l'indice, che sarà denominatore dell'esponente di Pow. Ovviamente se il radicando è negativo la funzione accetterà solo indici dispari.
La mia perplessità riguarda il fatto che vista la relativa frequenza di di questo tipo di calcoli, ci fossero già delle soluzioni built-in.
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Mar 2008
Messaggi: 267
|
Sì, è vero, in questo caso diventa impossibile. Al massimo si può modificare la funzione così:
Codice:
public double potenza(double x, double y)
{
if (x < 0 && y < 1 && Convert.ToInt32(1/y)%2 != 0)
return (-Math.Pow(-x, y));
else
return Math.Pow(x, y);
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:25.




















