Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Potenze con delphi...

327 views
Skip to first unread message

Christian Finotto

unread,
Nov 24, 1999, 3:00:00 AM11/24/99
to
Salve a tutti, e' possibile eseguire delle potenze con delphi ( e in
genere con pascal), tipo a^(2/3)

Grazie, gradita risposta via email

----
BJC -= Christia/\/ =-
E-Mail: b...@theoffice.net
SMS: Fill only subject to: b...@theoffice.net
WWW: http://www.theoffice.net/bjc
ICQ number: 4450897


Livio Rosini

unread,
Nov 24, 1999, 3:00:00 AM11/24/99
to
> Salve a tutti, e' possibile eseguire delle potenze con delphi ( e in
> genere con pascal), tipo a^(2/3)

Power raises Base to any power.

Unit

Math

Category

arithmetic routines

function Power(Base, Exponent: Extended): Extended;

Description

The Power function raises Base to any power. For fractional exponents or
exponents greater than MaxInt, Base must be greater than 0.


den

unread,
Nov 24, 1999, 3:00:00 AM11/24/99
to
Unit math

{ Exponential functions }
{ IntPower: Raise base to an integral power. Fast. }
function IntPower(Base: Extended; Exponent: Integer): Extended register;
{ Power: Raise base to any power.
For fractional exponents, or |exponents| > MaxInt, base must be > 0. }

Kirys

unread,
Nov 24, 1999, 3:00:00 AM11/24/99
to
On Stardate Wed, 24 Nov 1999 10:58:37 +0100, Christian Finotto
<b...@theoffice.net> wrote:

>Salve a tutti, e' possibile eseguire delle potenze con delphi ( e in
>genere con pascal), tipo a^(2/3)
>

>Grazie, gradita risposta via email

Sia in delphi e in pascal esisto le funzioni di logaritmo naturale e
di e^x
puoi fare la potenza di qualsiasi numero semplicemente sfruttando la
formula
a^k=e^ln(k)
e^x è rappresentato da EXP
ma il logaritmo ora non ricordo
di solito è log ma controlla che sia il logaritmo naturale (in base e)
e non in base 10
Salutoni
Kirys
--------------------------------------------------
Brayan Fix Kirys Solfory
E-Mail: Ki...@technologist.com
For Free Software go to: http://Kiryssoft.cjb.net

René

unread,
Nov 25, 1999, 3:00:00 AM11/25/99
to
> a^k=e^ln(k)
> e^x è rappresentato da EXP

Non sono molto convinto di questa formula...
mettiamo di voler fare: (-3)^(-1/2)... come faccio a prendere il logaritmo
di -1/2 ?


--
_________________________________

#ICQ: 17079401
http://quartaa.cjb.net
_________________________________

-->René<--
:-)

Michele '74

unread,
Nov 26, 1999, 3:00:00 AM11/26/99
to
Scusate, un po' di precisione:

a^b = exp(b*ln(a))

sfruttando questa equivalenza si può calcolare la potenza di qualsiasi
numero.

Ciao


René

unread,
Nov 26, 1999, 3:00:00 AM11/26/99
to
> a^b = exp(b*ln(a))

Non di qualsiasi numero !!!
a deve essere sempre > 0 quindi non potrai fare -3^3 per esempio...
Suggerimenti ?

Andrea Magni

unread,
Nov 26, 1999, 3:00:00 AM11/26/99
to
René <rena...@lycosmail.com> wrote...

> Non di qualsiasi numero !!!
> a deve essere sempre > 0 quindi non potrai fare -3^3 per esempio...
> Suggerimenti ?

Per quel che ne so io, in Matematica, potenze con base negativa ed esponente
reale _non_ sono definite... [ho una dimostrazione del perchè da qualche
parte nei miei appunti...]

Ciao :-)

--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)

AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply


René

unread,
Nov 26, 1999, 3:00:00 AM11/26/99
to

> Per quel che ne so io, in Matematica, potenze con base negativa ed
esponente
> reale _non_ sono definite... [ho una dimostrazione del perchè da qualche
> parte nei miei appunti...]

Esatto... niente base negativa con esponente reale...
Se io però mi faccio una funziona per elevare a potenza e la voglio
utilizzare per fare ad. esempio -3^5 non lo posso fare... a meno che... si
dovrebbe fare un controllo per vedere se l'esponente è un numero reale o
intero (mi viene in mente "if numero = trunc (numero)").
Se l'esponente è reale allora si usa la formula "a^b = exp(b*ln(a))"
altrimenti... se l'esponente è positivo allora
"a^b = exp(b*ln(abs(a)))", se invece è negativo "a^b
= -exp(b*ln(abs(a)))"...
dovrebbe funzionare... che ne dite ?

Gianfranco

unread,
Nov 26, 1999, 3:00:00 AM11/26/99
to
La formula corretta è a^k=e^(k*ln(a)). La base deve essere positiva.

"René" ha scritto:


>
> > a^k=e^ln(k)
> > e^x è rappresentato da EXP
>
> Non sono molto convinto di questa formula...
> mettiamo di voler fare: (-3)^(-1/2)... come faccio a prendere il logaritmo

> di -1/2 ?

Gianfranco

unread,
Nov 26, 1999, 3:00:00 AM11/26/99
to
Si, potrebbe andare... se ti interessa un risultato reale (e non
intero). Altrimenti occorre una sana iterazione.

Andrea Laforgia

unread,
Nov 27, 1999, 3:00:00 AM11/27/99
to
you wrote :

>> reale _non_ sono definite... [ho una dimostrazione del perchè da qualche
>> parte nei miei appunti...]
>
>Esatto... niente base negativa con esponente reale...

Non e' propriamente cosi'.
Non e' possibile calcolare il logaritmo di un numero non positivo, ma
non e' detto che la potenza non sia definita.
Ci sono infinite potenze con base negativa ed esponente reale, come,
per esempio :

(-27)^(1/3) = -3

--
Andrea Laforgia (andrea_...@bigfoot.com)

René

unread,
Nov 27, 1999, 3:00:00 AM11/27/99
to
> Non e' propriamente cosi'.
> Non e' possibile calcolare il logaritmo di un numero non positivo, ma
> non e' detto che la potenza non sia definita.
> Ci sono infinite potenze con base negativa ed esponente reale, come,
> per esempio :
>
> (-27)^(1/3) = -3

E come me la risolvi in DELPHI ?

Lo so che (-27)^(1/3) equivale a radice3 di (-27^1) e quindi č risolvibile
ma come lo spiego al Compilatore ?

Con la funzione per elevare a potenza che c'č nella unit Math č contemplato
questo caso ?

Andrea Magni

unread,
Nov 29, 1999, 3:00:00 AM11/29/99
to
Andrea Laforgia <andrea_...@bigfoot.com> wrote...

> Non e' propriamente cosi'.
> Non e' possibile calcolare il logaritmo di un numero non positivo, ma
> non e' detto che la potenza non sia definita.
> Ci sono infinite potenze con base negativa ed esponente reale, come,
> per esempio :
>
> (-27)^(1/3) = -3


Attento che quella che hai scritto è una potenza con base intera (cmq
supponiamola reale) ed esponente _razionale_...
Prova a fare (-27)^(radice di 2)...

Ciao

Andrea Laforgia

unread,
Nov 29, 1999, 3:00:00 AM11/29/99
to
you wrote :

>> (-27)^(1/3) = -3

>Attento che quella che hai scritto č una potenza con base intera (cmq


>supponiamola reale) ed esponente _razionale_...

I numeri razionali SONO numeri reali.
La natura intera o reale della base non c'entra.
Anche -275.732^(1/3) e' perfettamente calcolabile.

>Prova a fare (-27)^(radice di 2)...

Io sto dicendo che non e' corretto affermare che una potenza con base
negativa ed esponente reale non sia definita, in quanto esistono
infiniti casi in cui il calcolo si puo' eseguire con successo.
Inoltre, per risponderti, (-27)^(1/2) non e' definito nel campo dei
numeri reali, ma ha comunque una soluzione (sebbene non interessi
gestirla nello specifico).
Se si escludessero i casi, come quello che ho citato precedentemente,
in un programma di matematica, si farebbe un grosso errore di
sottovalutazione.

--
Andrea Laforgia (andrea_...@bigfoot.com)
---------------------------------------------

Andrea Laforgia

unread,
Nov 29, 1999, 3:00:00 AM11/29/99
to
you wrote :

>> Non e' propriamente cosi'.
>> Non e' possibile calcolare il logaritmo di un numero non positivo, ma
>> non e' detto che la potenza non sia definita.
>> Ci sono infinite potenze con base negativa ed esponente reale, come,
>> per esempio :
>>
>> (-27)^(1/3) = -3
>

>E come me la risolvi in DELPHI ?

E' bene precisare se si sta parlando di matematica, o se si sta
parlando di Delphi.
La soluzione che hai trovato, *potrebbe* andare bene per i tuoi scopi.

Michele '74

unread,
Nov 30, 1999, 3:00:00 AM11/30/99
to
P.S: per il dubbio di René, la potenza a^b con a e b numeri reali qualunque
è definita solo per a>0, quindi il logaritmo si può applicare senza
problemi.

Ciao!

René

unread,
Nov 30, 1999, 3:00:00 AM11/30/99
to
Michele '74 <07218...@iol.it> wrote in message
DeP04.1444$Ip3....@typhoon.libero.it...

Su questo non ci sono dubbi..

Mettiamo tanto per fare un esempio di dover crare una calcolatrice...
Dobbiamo definire una funzione per elevare al quadrato...
Se usiamo a^b=Exp(b*ln(a)) allora sarebbe molto limitato in quanto non
potremme fare -3^2 per esempio...
... quindi ?

René

unread,
Nov 30, 1999, 3:00:00 AM11/30/99
to
Un'altra cosa... La funzione compresa nella unit Math com'è ? contempla
tutti i casi ?

René

unread,
Nov 30, 1999, 3:00:00 AM11/30/99
to

> E' bene precisare se si sta parlando di matematica, o se si sta
> parlando di Delphi.

Diciamo che stiamo parlando di "Matematica applicata in Delphi" o di "Delphi
applicato alla matematica".... sciegli tu ! :-)

Livio Rosini

unread,
Nov 30, 1999, 3:00:00 AM11/30/99
to
> > Non e' possibile calcolare il logaritmo di un numero non positivo, ma
> > non e' detto che la potenza non sia definita.
> > Ci sono infinite potenze con base negativa ed esponente reale, come,
> > per esempio :
> >
> > (-27)^(1/3) = -3

> E come me la risolvi in DELPHI ?
>

> Lo so che (-27)^(1/3) equivale a radice3 di (-27^1) e quindi è


> risolvibile ma come lo spiego al Compilatore ?
>

> Con la funzione per elevare a potenza che c'è nella unit Math è
> contemplato questo caso ?

Ho fatto qualche prova con la funzione Power del Delphi (4).

Risultati: funziona in tutti i casi tranne:

1 -- quando la base e' negativa e l'esponente e' non intero.

Power (-2, 3.7)
Power (-2, -3.7)
Power (-2.7, 3.7)
Power (-2.7, -3.7)

2 -- quando la base e' zero e l'esponente e' negativo.

Power (0, -3)
Power (0, -3.7)

In tutti gli altri casi da' un risultato, anche se in certi casi e'
discutibile. Per esempio da'

Power (0, 0) = 1

Quanto al caso proposto da qualcuno Power (-27, 1/3) rientra nei casi per
cui da' errore. Penso che il compilatore effettui una chiamata con un valore
approssimato di 1/3, tipo 0.333333333, per cui non c'e' speranza che venga
riconoscituo come 1/3. Ci vorrebbe un programma di calcolo simbolico (tipo
Derive, che rende il valore -3) e non un compilatore che genera un programma
che effettua calcoli puramente numerici.


Andrea Laforgia

unread,
Nov 30, 1999, 3:00:00 AM11/30/99
to
you wrote :

>Quanto al caso proposto da qualcuno Power (-27, 1/3) rientra nei casi per
>cui da' errore. Penso che il compilatore effettui una chiamata con un valore
>approssimato di 1/3, tipo 0.333333333, per cui non c'e' speranza che venga
>riconoscituo come 1/3. Ci vorrebbe un programma di calcolo simbolico (tipo
>Derive, che rende il valore -3) e non un compilatore che genera un programma
>che effettua calcoli puramente numerici.

Non e' questo il problema.
1/3 viene approssimato in modo abbastanza buono da qualunque
compilatore che adotti un formato floating-point sufficientemente
esteso. Il compilatore C DJGPP, per esempio, adotta il formato IEEE
754 che in precisione doppia (senza considerare l'estesa) ha una
rappresentazione con 16 cifre significative, il che e' garanzia di
un'ottima approssimazione.
Il problema e' dovuto al fatto che la routine di calcolo della potenza
sfrutta la funzione logaritmo che ha per dominio il sottoinsieme del
campo dei reali, formato da tutti i reali positivi.
L'incapacita' di eseguire una potenza con base 0 ed esponente negativo
sta nel fatto che e' come eseguire una divisione per zero (0^(-1)
equivale a 1/0).
--
Andrea Laforgia
andrea_...@bigfoot.com

Livio Rosini

unread,
Dec 1, 1999, 3:00:00 AM12/1/99
to
>> Quanto al caso proposto da qualcuno Power (-27, 1/3) rientra nei casi per
>> cui da' errore. Penso che il compilatore effettui una chiamata con un
>> valore approssimato di 1/3, tipo 0.333333333, per cui non c'e' speranza
>> che venga riconoscituo come 1/3. Ci vorrebbe un programma di calcolo
>> simbolico (tipo Derive, che rende il valore -3) e non un compilatore che
>> genera un programma che effettua calcoli puramente numerici.

> Non e' questo il problema.
> 1/3 viene approssimato in modo abbastanza buono da qualunque
> compilatore che adotti un formato floating-point sufficientemente
> esteso. Il compilatore C DJGPP, per esempio, adotta il formato IEEE
> 754 che in precisione doppia (senza considerare l'estesa) ha una
> rappresentazione con 16 cifre significative, il che e' garanzia di
> un'ottima approssimazione.
> Il problema e' dovuto al fatto che la routine di calcolo della potenza
> sfrutta la funzione logaritmo che ha per dominio il sottoinsieme del
> campo dei reali, formato da tutti i reali positivi.

Si che e' (anche) questo il problema.

Quel che fa attualmente la funzione Power (Delphi 4) e' questo:

function Power(Base, Exponent: Extended): Extended;

begin
if Exponent = 0.0 then
Result := 1.0 { n**0 = 1 }
else if (Base = 0.0) and (Exponent > 0.0) then
Result := 0.0 { 0**n = 0, n > 0 }
else if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt) then
Result := IntPower(Base, Integer(Trunc(Exponent)))
else
Result := Exp(Exponent * Ln(Base))
end;

Se volessimo complicare le cose e, oltre a verificare se per caso non sia

Frac (Exponent) = 0.0

verificassimo pure se per caso non fosse

Frac (1 / Exponent) = 0.0

troveremmo comunque falsa la condizione quando Power fosse chiamata con un
valore di 1/3, per quanto bene questo fosse approssimato. E questo proprio
anche a causa della codifica adottata per i numeri, codifica con la quale si
possono rappresentare esattamente solo numeri rappresentabili con una
frazione il cui denominatore sia una potenza di due.

Cosi' la nuova versione della nostra funzione riconoscerebbe come inversi di
un numero naturale 1/2, 1/4 o 1/4096 ma non 1/3 o 1/10. Neppure col formato
Extended.

Andrea Laforgia

unread,
Dec 1, 1999, 3:00:00 AM12/1/99
to
you wrote :

>troveremmo comunque falsa la condizione quando Power fosse chiamata con un
>valore di 1/3, per quanto bene questo fosse approssimato.

L'hai testato ? L'epressione Frac( 1/ (1/3) ) = 0.0 restituisce TRUE.
E questo, ribadisco, e' dovuto al fatto che l'approssimazione di 1/3
e' abbastanza buona.

--
Andrea Laforgia
andrea_...@bigfoot.com

Livio Rosini

unread,
Dec 1, 1999, 3:00:00 AM12/1/99
to
>> troveremmo comunque falsa la condizione quando Power fosse chiamata con
>> un valore di 1/3, per quanto bene questo fosse approssimato.

> L'hai testato ? L'epressione Frac( 1/ (1/3) ) = 0.0 restituisce TRUE.
> E questo, ribadisco, e' dovuto al fatto che l'approssimazione di 1/3
> e' abbastanza buona.

Hai ragione. Effettivamente Frac( 1/ (1/3) ) = 0.0 restituisce True. Non
l'avevo testato. Pero' sospetto che ci sia di mezzo qualche furbata
dell'ottimizzatore, il quale, forse, effettua lui la semplificazione in fase
di compilazione e genera la stessa codifica che genererebbe con Frac (1) =
0.0 che ovviamente produce un True.

Per vedere di risolvere la faccenda ho allora fatto un esperimento di questo
tipo:

function F (x: Tipo1): Boolean;
begin
Result := Frac (1 / x) = 0.0
end;

procedure TForm1.Button1Click(Sender: TObject);
var a: Tipo2;
begin
a := 1/3;
if F (a) then
Label1.Caption := 'True'
else
Label1.Caption := 'False';
end;

provando a sostituire a Tipo1 e a Tipo2 in tutti i nove modi possibili i
tipi Single, Double e Extended.

Ho ottenuto un risultato un po' strano. Quando i due tipi sono entrambi
Extended il risultato e' True. Negli altri otto casi il risultato e' False.
Se poi a a := 1/3; sostituiamo a := 1/500 anche il caso che
prima rendeva True ora rende False.

Per quanto buone siano le approssimazioni, i numeri reali, nelle codifiche
usate nei computer, ci dicono solo che il numero cade in un certo
intervallo. Quindi non trovo molto sensato chiedersi se un reale sia o non
sia anche un intero.

Secondo me i costruttori di Delphi avrebbero fatto meglio a non far chiamare
dalla funzione Power, in certi casi, la funzione IntPower. Meglio avrebbero
fatto lasciando a chi scrive i programmi la responsabilita' di decidere di
volta in volta quale delle due funzioni utilizzare.


Andrea Laforgia

unread,
Dec 1, 1999, 3:00:00 AM12/1/99
to
you wrote :

>Hai ragione. Effettivamente Frac( 1/ (1/3) ) = 0.0 restituisce True. Non
>l'avevo testato. Pero' sospetto che ci sia di mezzo qualche furbata
>dell'ottimizzatore, il quale, forse, effettua lui la semplificazione in fase
>di compilazione e genera la stessa codifica che genererebbe con Frac (1) =
>0.0 che ovviamente produce un True.

Proprio non ti vuoi convincere che non e' cosi'.

>Ho ottenuto un risultato un po' strano. Quando i due tipi sono entrambi
>Extended il risultato e' True. Negli altri otto casi il risultato e' False.
>Se poi a a := 1/3; sostituiamo a := 1/500 anche il caso che
>prima rendeva True ora rende False.

Entrare nel dettaglio tecnico della questione comporterebbe un sicuro
off-topic, ma mi limito a dire che il problema in questo caso e'
dovuto probabilmente al modo in cui viene sfruttato lo standard IEEE
754, quello che viene coinvolto quando si attiva il coprocessore
matematico e quindi i tipi single, double ed extended.
Bisogna cioe', verificare in che modo i numeri codificati in questo
standard vengono confrontati con 0.0.
Comunque, la conclusione e' che Frac(1/esp) = 0.0 non e' un test
affidabile.

--
Andrea Laforgia
andrea_...@bigfoot.com

Livio Rosini

unread,
Dec 2, 1999, 3:00:00 AM12/2/99
to
>> Hai ragione. Effettivamente Frac( 1/ (1/3) ) = 0.0 restituisce True. Non
>> l'avevo testato. Pero' sospetto che ci sia di mezzo qualche furbata
>> dell'ottimizzatore, il quale, forse, effettua lui la semplificazione in
fase
>> di compilazione e genera la stessa codifica che genererebbe con Frac (1)
=
>> 0.0 che ovviamente produce un True.

> Proprio non ti vuoi convincere che non e' cosi'.

Non e' vero. Mi sono convinto. Nel caso di cui parlavo nel mio precedente
messaggio (entrambi i tipi Extended e valore di a = 500) ottenevamo False.

Ho provato Frac (1 / (1 / 500)) = 0.0 e ottengo ancora False. Se i miei
sospetti sull'ottimizzatore fossero stati fondati avrei dovuto ottenere
True.


Andrea Magni

unread,
Dec 2, 1999, 3:00:00 AM12/2/99
to
Andrea Laforgia <andrea_...@bigfoot.com> wrote...

> I numeri razionali SONO numeri reali.

Ok,... peccato che non tutti i razionali siano reali...

> La natura intera o reale della base non c'entra

E chi ha mai detto che c'entra? (leggi anche le parentesi dei miei msg
please)

> Io sto dicendo che non e' corretto affermare che una potenza con base
> negativa ed esponente reale non sia definita, in quanto esistono
> infiniti casi in cui il calcolo si puo' eseguire con successo.

Ok, ti faccio però presente che quando io ho scritto "reale" intendevo non
razionale...
Ovvio che anche i razionali appartengono ai reali ma se un numero è
razionale in genere lo si chiama razionale, non reale...

> Inoltre, per risponderti, (-27)^(1/2) non e' definito nel campo dei
> numeri reali, ma ha comunque una soluzione (sebbene non interessi
> gestirla nello specifico).

Intendevi (-27)^[2^(1/2)], vero?
Ti riferisci ai numeri complessi?
Non saprei (in fin dei conti io faccio la 4ª scientifico), magari chiedo
alla mia prof di Matematica... [o magari Cosimo ci sta leggendo?]

Ciao :-)

Cosimo Laddomada

unread,
Dec 3, 1999, 3:00:00 AM12/3/99
to
Andrea Magni wrote

> [o magari Cosimo ci sta leggendo?]

Certo, Andrea,
vi leggo, ho seguito l'argomento con attenzione e piu' volte sono stato
tentato di intervenire. Non l'ho fatto per carenza di tempo (si sara' notata
la mia assenza da un po' di tempo!), non senza qualche complesso di colpa.
Ma ora mi tiri in ballo e mi dai l'opportunita' di redimermi. Ma non saro'
breve... l'hai voluto tu. ;-)

Tutti quanti vi siete sorbiti a scuola la sequela di definizioni di POTENZA
nei vari ambiti (insiemi) numerici. Nel passare da un ambito ad un altro si
chiedeva, piu' o meno esplicitamente, che le vecchie proprieta', valide
nell'ambito precedente, continuassero a valere anche nel nuovo ambito.

Dalla potenza b^n in N, prima definita per b qualsiasi e n>1, come
b^n=b*b*..., poi dando un significato anche a b^1 e b^0 ma non a 0^0, siete
passati al caso in cui b e/o n potessero essere negativi, definendo b^(-n)
come 1/(b^n) [escludendo il caso di base nulla ed esponente negativo]. Siete
passati quindi a dare significato anche al caso di potenze con base
razionale (positiva, nulla o negativa). Dopo aver definito le radici, e aver
visto le condizioni della loro esistenza (indice dispari, no problem, indice
pari solo con radicandi >=0) avete introdotto la CONVENZIONE di indicare una
radice con una potenza, estendendo cosi' il significato di potenza anche al
caso di esponenti razionali.

Attenzione a questo punto!
Il fatto di porre PER DEFINIZIONE b^(m/n) = rad_n(b^m) implica per b^(m/n)
tutte le eccezioni provenienti dal non poter calcolare rad_n(b^m). Ad
esempio:

(-2)^(6/4) rappresenta rad_4((-2)^6), perfettamente calcolabile e il cui
risultato e' 2*rad_2(2).
(-2)^(3/2) rappresenterebbe rad_2((-2)^3), cioe' rad_2(-8), ovviamente
inesistente nel campo dei numeri reali.

Eppure, se noi vogliamo dare un significato alle potenze con esponente
razionale e pretendere che valgano le proprietą formali dei numeri e delle
operazioni fra essi, le due potenze (-2)^(6/4) e (-2)^(3/2) dovrebbero
essere identiche in quanto 6/4 e 3/2 sono due frazioni equivalenti! Ma cosi'
non e'; come si e' visto, la prima di tali potenze esiste, la seconda no.

NON ILLUDIAMOCI poi che possano esistere casi in cui il problema precedente
non sussiste: ad esempio, esiste perfettamente il numero
(-2)^(2/3)=(-2)^(4/6)=(-2)^(6/9)=.... Questo potrebbe far credere che si
possa definire la potenza con base negativa quando l'esponente razionale ha
numeratore pari. COSI NON E'. Infatti, se si vogliono valide le usuali
proprieta' delle potenze,

da (-2)^(2/3)=rad_3(4)
dovrebbe seguire che ((-2)^(2/3))^(9/4) dovrebbe essere perfettamente
calcolabile anche se applichiamo la nota proprieta' della "potenza di
potenza". E invece:

((-2)^(2/3))^(9/4) = (-2)^(2/3 * 9/4) = (-2)^(3/2) = rad_2(-8)
che non esiste!!!

Queste ed altre ragioni portano a concludere l'impossibilita' di definire le
potenze con esponente razionale e base negativa, pretendendo anche la
validita' delle usuali proprieta' dell'aritmetica e del calcolo.

E ora veniamo al calcolo effettivo e pratico di una potenza.
Quando si sta calcolando una potenza, ciascuno deve sapere quello che
effettivamente sta richiedendo. Se uno sta calcolando una radice, ebbene sta
calcolando una radice (ma va?); questo vuol dire che, se vuole utilizzare la
possibilita' di vedere la radice come una potenza, lo puo' fare solo se tale
equivalenza e' permessa.

Qualsiasi algoritmo uno si costruisca per calcolare le potenze, deve tenere
conto del contesto in cui tale algoritmo e' valido. Quelli di Delphi (POWER
e INTPOWER) contenuti nell'unit MATH vanno entrambi bene nei contesti in cui
sono dichiarati essere validi e l'utilizzatore dev'essere ben conscio di
cosa sta realmente calcolando ed eventualmente costruirsi algoritmi ad hoc.
Certo, il programmatore di POWER e INTPOWER avrebbe potuto fare meglio, per
esempio non permettendo che entrambi i due algoritmi forniscano un risultato
(1) per potenze non definite (0^0); ma, ragazzi, ci potete mettere voi una
pezza. :-)

Sulla nota uguaglianza a^x = e^(x*LN a) non mi soffermo; se e' chiaro quello
che ho detto prima dovrebbe essere altrettanto chiaro che questa uguaglianza
e' valida nelle condizioni in cui e' valida!! ;-))

Infine, non mi sembra produttivo spendere tempo cercare di costruirsi
algoritmi complicatissimi che vadano a testare le parti frazionarie
dell'esponente e/o della base per poter dedurre se ci si trova nel caso di
una potenza o di una radice, di una radice fattibile o di una radice non
calcolabile, ecc. Con quello che passa la rappresentazione binaria dei
numeri float e il funzionamento dei coprocessori matematici sarebbe meglio
andare a raccogliere fiorellini, ci si guadagna di piu', non vi pare? :-)

Scusate la sbrigativita' sugli utlimi argomenti (devo scappare a scuola), la
prolissita' ed eventualmente qualche strafalcione che mi e' scappato... non
abbiate timore a tirare pietre, io sono qui.

Per adesso vi saluto tutti,

------------------------------------------
Mimmo Laddomada (c.lad...@agora.stm.it)

Andrea Magni

unread,
Dec 3, 1999, 3:00:00 AM12/3/99
to
Cosimo Laddomada <c.lad...@agora.stm.it> wrote...

> Certo, Andrea,
> vi leggo, ho seguito l'argomento con attenzione e piu' volte sono stato
> tentato di intervenire. Non l'ho fatto per carenza di tempo (si sara'
notata
> la mia assenza da un po' di tempo!), non senza qualche complesso di colpa.
> Ma ora mi tiri in ballo e mi dai l'opportunita' di redimermi. Ma non saro'
> breve... l'hai voluto tu ;-)

Ciao Cosimo,
è sempre un piacere leggerti...
Come al solito sei stato completo, esaustivo e preciso, si vede che sei un
buon insegnante... (tra l'altro non ricordo + se insegni all'Univ. o
altro...)
Grazie per l'intervento.

Andrea Laforgia

unread,
Dec 3, 1999, 3:00:00 AM12/3/99
to
you wrote :

>questo vuol dire che, se vuole utilizzare la
>possibilita' di vedere la radice come una potenza, lo puo' fare solo se tale
>equivalenza e' permessa.

Infatti e' cosi', io non dico affatto il contrario.
Bisogna vedere, l'ho detto sin dall'inizio, per quale contesto bisogna
costruire un algoritmo del genere.
Il fulcro della discussione e' che se e' vero che non e' possibile
definire la funzione R^2->R : z = x^y, per qualsiasi (x,y), e' anche
vero che e' possibile definirla per un sottoinsieme del dominio,
equipotente con esso.
Il problema, a questo punto, e' individuare se la coppia (x,y)
appartiene a tale insieme o no.
Ci sono programmi, vedi MS Excel, che riescono ad eseguire il calcolo
per tutte le condizioni in cui esso e' possibile.
Se si vuole costruire una routine del genere, bisogna fare attenzione
a non escludere nessun caso.
Se cosi' non fosse, i metodi proposti potrebbero andare bene.

--
Andrea Laforgia
andrea_...@bigfoot.com

Andrea Laforgia

unread,
Dec 3, 1999, 3:00:00 AM12/3/99
to
you wrote :

>> I numeri razionali SONO numeri reali.
>Ok,... peccato che non tutti i razionali siano reali...

Certo che tutti i razionali sono reali !!! Ci mancherebbe altro...
Forse volevi dire che non tutti i reali sono razionali.

Comunque, ti ricordo l'affermazione di partenza :


"niente base negativa con esponente reale..."

In matematica bisogna utilizzare un linguaggio assolutamente formale e
dire questo, a meno di affermare che ci si sta riferendo a quei reali
per i quali non e' definibile il calcolo, non e' formalmente corretto.


>> La natura intera o reale della base non c'entra
>
>E chi ha mai detto che c'entra? (leggi anche le parentesi dei miei msg
>please)

Avro' frainteso, ma la tua frase tra parentesi mi sembrava una
correzione del fatto che la base fosse intera.

Non devo supporre necessariamente che sia reale.

Posso definire benissimo la funzione potenza z = x^y : NxI -> R con x
app. a N e y app. a I, sottoinsieme di R.

>Intendevi (-27)^[2^(1/2)], vero?

No, intendevo esattamente (-27)^(1/2) che ha soluzione nel campo
complesso.

--
Andrea Laforgia
andrea_...@bigfoot.com

Carlo Bosich

unread,
Dec 4, 1999, 3:00:00 AM12/4/99
to
Cosimo,

> vi leggo, ho seguito l'argomento con attenzione e piu' volte sono stato
> tentato di intervenire. Non l'ho fatto per carenza di tempo (si sara'
notata
> la mia assenza da un po' di tempo!), non senza qualche complesso di colpa.
> Ma ora mi tiri in ballo e mi dai l'opportunita' di redimermi. Ma non saro'
> breve... l'hai voluto tu. ;-)

complimenti per l'intervento e grazie per la partecipazione,
mi auguro che in futuro tu possa partecipare piu' attivamente.
(anch'io non scherzo comunque... )-:

Ciao ;-)
Carlo

Cosimo Laddomada

unread,
Dec 5, 1999, 3:00:00 AM12/5/99
to
Carlo Bosich wrote

> mi auguro che in futuro tu possa partecipare piu' attivamente.
> (anch'io non scherzo comunque... )-:

:-)
Ciao Carlo.
In realta', nei NG su Delphi c'e' ormai un bel po' di gente in gamba, quindi
posso stare solo a guardare. ;-)

Tuttavia, per la natura della mia professione, sono interessato ad argomenti
come quello in corso, quindi, quando posso, cerco di dare il mio contributo.

Salutissimi,
------------------------------------------
Mimmo Laddomada (c.lad...@agora.stm.it)


Cosimo Laddomada

unread,
Dec 5, 1999, 3:00:00 AM12/5/99
to
> Ciao Cosimo,
> è sempre un piacere leggerti...
> Come al solito sei stato completo, esaustivo e preciso, si vede che sei un
> buon insegnante... (tra l'altro non ricordo + se insegni all'Univ. o
> altro...)

Troppo buono, Andrea.
Insegno in un Liceo Classico di Lecce, ma ogni tanto infierisco anche nella
locale universita'. ;-)

Ciao,

------------------------------------------
Mimmo Laddomada (c.lad...@agora.stm.it)


Cosimo Laddomada

unread,
Dec 5, 1999, 3:00:00 AM12/5/99
to
> Infatti e' cosi', io non dico affatto il contrario.

OK Andrea.
Credo fermamente che sai perche' la funzione a^x e' definita come e'
definita. Pero' poni in rapporto falsato la "calcolabilita'" e la
"definibilita'" di una funzione; puo' succedere che una funzione sia
definibile ma non calcolabile ma non il contrario, a meno di contraddizioni.

Ti chiedo un po' di pazienza; seguimi e dammi cosi' l'occasione di
spiegarmi.

Per chiarezza, riassumiamo le condizioni di validita' di a^x, cosi' come i
sacri testi recitano:

1) a = 0 ==> a^x = 0 per ogni x > 0
2) a = 1 ==> a^x = 1 per ogni x Reale
3) a>0 e <>1 ==> a^x = .... per ogni x Reale

Per la loro banalita', generalmente i casi 1) e 2) non vengono considerati
nella definizione della funzione esponenziale (un'altra ragione piu' seria,
e' che in quei casi non esiste la funzione inversa).

La definizione cui al caso 3) si avvale fortemente della equivalenza di
significato, fra il simbolo a^(m/n) e quello di radice_n(a^m) (m e n interi,
ammettiamo positivi, per semplicita' in quel che vado dicendo). Ebbene,
questa equivalenza viene introdotta, per definizione, SOLO PER a >= 0.
Nell'altro mio messaggio ho cercato di dare alcune ragioni per cui e'
impossibile (o "quasi", vedi dopo) DEFINIRE a^(m/n) quando e' a<0 e su
questo credo che non hai niente da eccepire, ma...

> Il fulcro della discussione e' che se e' vero che non e' possibile
> definire la funzione R^2->R : z = x^y, per qualsiasi (x,y), e' anche
> vero che e' possibile definirla per un sottoinsieme del dominio,
> equipotente con esso.

Lascerei stare le considerazioni sull'equipotenza; non ci "azzecca" molto.
:-)

> Il problema, a questo punto, e' individuare se la coppia (x,y)
> appartiene a tale insieme o no.

Bene. Arriviamo cosi' al nocciolo della questione.

Quali sono dunque i casi in cui a^x, con a<0, potrebbe essere definita *E*
calcolata. Sicuramente quando x e' un INTERO. Infatti sono perfettamente
definibili e calcolabili (-3)^2, (-3)^(-2), e cosi' via. Tuttavia, nella
definizione di funzione esponenziale si preferisce non dare luogo a un
simile caso, perche' la funzione che si otterrebbe sarebbe di scarso
utilizzo nell'ambito dell'ANALISI DEL CONTINUO, dato che il suo insieme di
definizione sarebbe N, un insieme discreto. Questo non vuol dire che non ci
sono contesti in cui una tale funzione non sia utile e, in effetti, nulla
vieta di definire la funzione esponenziale a^x (a<0), in N. [In effetti, una
funzione pascal che opera in questo modo la si puo' costruire e la funzione
Power dell'unit Math fa proprio questo, anche se lascia un po' a
desiderare.]

> Ci sono programmi, vedi MS Excel, che riescono ad eseguire il calcolo
> per tutte le condizioni in cui esso e' possibile.
> Se si vuole costruire una routine del genere, bisogna fare attenzione
> a non escludere nessun caso.

A questo punto tu credi che si possa calcolare a^x (a<0) anche in alcuni
casi in cui x e' razionale (non intero!). E porti l'esempio di (-27)^(1/3)
= -3. Ma, su cosa poggi questo calcolo? Implicitamente, sul fatto che il
significato di elevare a (1/3) equivale a fare la radice cubica. Ora, questa
equivalenza non esiste per basi negative. Ma tu diresti: "Chi ci vieta di
estenderla anche ai casi in cui esiste una radice di un numero negativo?".
Questa richiesta sembra lecita; il guaio e' che in matematica puoi definire
tutto quello che vuoi, ma SENZA ENTRARE IN CONTRADDIZIONE con altre regole
che intendi adottare.

Siamo piu' espliciti.
Tu costruuisci una funzione ESPONENZIA(a,x) che, quando a<0, ti sappia
riconoscere (si puo' fare, ed Excel lo fa!) se x e' della forma 1/n e, in
tal caso ti da' il risultato giusto, la radice n-esima di a. Ad esempio,
avresti:

ESPONENZIA(-27, 1/3) = -3

Dici che e' una cosa ben fatta? Immagino che vorrai usare questa funzione
anche per calcolare ESPONENZIA(-27, 2/6) e vorresti ottenere ERRORE perche'
il TUO intendimento e' quello di calcolare la radice sesta di -27 al
quadrato. Ma come fa la tua funzione a DISTINGUERE fra 1/3 e 2/6?? Neanche
Excel ci riesce! Potresti obiettare: "Non me ne frega niente; se voglio
calcolare una radice sesta di una cosa al quadrato, prendero' le mie
cautele". E siamo gia' alle cautele, nei fatti, di difficile management.

E poi. Immagino che la tua funzione ESPONENZIA debba saper calcolare anche
ESPONENZIA(-2, 5/3) che, per la supposta equivalenza con la radice terza di
(-2)^5, dovrebbe esistere. Ma, mentre e' cosa relativamente facile testare
se un x e' in realta' un 1/n, non saprei proprio dove mettere le mani su
come fare a riconoscere se un float e' un m/n, specie se consideri che un
float e' sempre un razionale! E rimarrebbe sempre lo stesso inghippo
precedente (quando prendi frazioni equivalenti).

In conclusione; siccome le potenze con base negativa, se hanno senso, lo
sono solo quando rappresentano delle radici o delle potenze a esponente
intero, per le prime e' meglio costruirsi una funzione radice, per le
seconde
puoi anche programmarle all'interno di un'unica funzione esponenziale.

Il codice seguente potrebbe soddisfare le aspettative in tal senso;
l'attachment contiene un programma di test. Notare la comoda tecnica
dell'overloading, permessa in Delphi5 e che ti permette di chiamare la
funzione potenza passando un extended e un intero o due extended, con scelta
automatica della funzione giusta.

function POTENZA(Base: Extended; Exponent: Integer): Extended; overload;
begin
try
if (Exponent <= 0) and (Base = 0.0)
then raise Exception.Create('');
result := IntPower(Base, Exponent); // IntPower si trova nell'unit MATH
except
raise Exception.Create('Potenza non definita');
end;
end;

function POTENZA(Base, Exponent: Extended): Extended; overload;
begin
try


if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt)

then Result := POTENZA(Base, Integer(Trunc(Exponent)))
else if (Base=0.0) and (Exponent > 0)
then Result := 0


else Result := Exp(Exponent * Ln(Base))

except
raise Exception.Create('Potenza non definita')
end
end;

function RADICE(Base: Extended; exp, ind: Integer): Extended; overload;
begin
try
if (ind < 1) or ((Base < 0) and Odd(exp) and not Odd(ind))
then raise Exception.Create('');
result := POTENZA(ABS(Base), exp/ind);
if (Base < 0) and Odd(exp) and Odd(ind) then result := -result
except
raise Exception.Create('Radice non definita')
end
end;

Ti saluto. Aspetto commenti e critiche. L'argomento mi interessa.

Power.zip

Cosimo Laddomada

unread,
Dec 5, 1999, 3:00:00 AM12/5/99
to
RISPEDISCO perche' la mia precedente risposta mi e' stata cancellata in
quanto conteneva un attachment. Sigh, chiedo scusa per aver disatteso una
regola basilare. Per chi fosse interessato all'attachment me lo puo'
richiedere personalmente.
========================================================================

Cosimo Laddomada

unread,
Dec 5, 1999, 3:00:00 AM12/5/99
to
Mi correggo,

> Dici che e' una cosa ben fatta? Immagino che vorrai usare questa funzione
> anche per calcolare ESPONENZIA(-27, 2/6) e vorresti ottenere ERRORE

> perche'...

Dici che e' una cosa ben fatta? Immagino che vorrai usare questa funzione

anche per calcolare ESPONENZIA(-27, 2/6) e vorresti ottenere +3 perche'...

------------------------------------------
Mimmo Laddomada (c.lad...@agora.stm.it)

Andrea Laforgia

unread,
Dec 5, 1999, 3:00:00 AM12/5/99
to
you wrote :

>come fare a riconoscere se un float e' un m/n, specie se consideri che un
>float e' sempre un razionale!

Ehm....In che senso "un float e' sempre razionale" ?

>In conclusione; siccome le potenze con base negativa, se hanno senso, lo
>sono solo quando rappresentano delle radici o delle potenze a esponente
>intero, per le prime e' meglio costruirsi una funzione radice, per le
>seconde puoi anche programmarle all'interno di un'unica funzione esponenziale.

Sono d'accordo.

--
Andrea Laforgia
andrea_...@bigfoot.com

Andrea Magni

unread,
Dec 6, 1999, 3:00:00 AM12/6/99
to
Cosimo Laddomada <c.lad...@agora.stm.it> wrote...
> Troppo buono, Andrea.

Uè, quando uno se lo merita... ;-)
[anche se non so quanto te ne freghi che un ragazzino di 17 anni ti venga a
dire che sei un grande .. :-) ]

> Insegno in un Liceo Classico di Lecce, ma ogni tanto infierisco anche
nella
> locale universita'. ;-)

Hai capito... io sono di Bergamo quindi ce ne stanno di chilometri in mezzo
;-)

Un saluto :-)

Andrea Magni

unread,
Dec 6, 1999, 3:00:00 AM12/6/99
to
Andrea Laforgia <andrea_...@bigfoot.com> wrote...

> Ehm....In che senso "un float e' sempre razionale" ?

Nel senso che per un computer il numero Pi-greco è 3.14ecc ecc fino a un
certo numero di decimali ***e stop***...
Mentre noi sappiamo bene che non è così... [idem per la radice di 2 ecc ecc
ecc]

Per quanto ben approssimato non potrai _mai_ con un computer rappresentare
un irrazionale [o forse con l'ausilio di un sistema che si basa sulla fuzzy
logic...]

Ciao :-)

Andrea Laforgia

unread,
Dec 7, 1999, 3:00:00 AM12/7/99
to
you wrote :

>Nel senso che per un computer il numero Pi-greco è 3.14ecc ecc fino a un
>certo numero di decimali ***e stop***...

Cioe' una rappresentazione approssimata di un irrazionale.
In questo senso e' giusto.
--
Andrea Laforgia
andrea_...@bigfoot.com

Andrea Magni

unread,
Dec 7, 1999, 3:00:00 AM12/7/99
to
Andrea Laforgia <andrea_...@bigfoot.com> wrote ...

> Cioe' una rappresentazione approssimata di un irrazionale.
> In questo senso e' giusto.

E quindi, evidentemente, vale la seguente uguaglianza:

[rappresentazione approssimata]=[numero razionale]

0 new messages