Newsgroup: it.comp.lang.pascal
Titolo: [INFO] PAS Math 0.28

Ciao a tutti.
Questa nuova versione di PAS Math
accetta finalmente prodotti impliciti.
Potrete dunque scrivere tranquillamente
qualcosa del tipo:
1|2(3|4|3)2|1+2!3!4!
sicuri che essa verra' interpretata
correttamente. (O meglio, voi siatene
sicuri; io lo sono quasi :-P)
E' stato corretto inoltre qualche bug:
- Se provate a fare "(-1)!" ora il prog
si rifiuta di farlo;
- Se provate a scrivere "2.0.5" ora il
prog non l'accetta (strano! Ero
convito di aver gia' previsto questo
caso diverse versioni fa :-!).
Inoltre ho aggiunto un semplice
comando per inserire una pausa
(di 700 ms, ma si puo' cambiare)
tra un passaggio e un altro.
Come sempre, l'entropìa del codice
cresce a dismisura!
Provatelo per favore, se ne avete tempo.
Mi piacerebbe essere sicuro di essermi
liberato di tutti i bug (e magari
ottimizzare un po' il codice) prima di
passare a cose piu' complesse,
come la gestione di variabili, frazioni,
funzioni e, perche' no, un'interfaccia
piu' umana (nuovi comandi, possibilita'
di recuperare espressioni scritte
precedentemente, colori che aiutino
nella chiusura delle parentesi, ecc...).
Ciao, Carmelo. :-)


Ciao, avrei da suggerire 2 modifiche:
1) interpretazione dei prodotti impliciti, scrivendo
  2 (spazio) 3
il programma restituisce il numero ventitre', mentre forse dovrebbe
considerarla una moltiplicazione e restituire
  6
2) bug nell'elevamento a potenza, considerando che
  2 * 1/2 = 1 <=> 2 ^ 1 * 2 ^ -1 = 2 ^ 0  per proprieta' delle potenze
si pone 2 ^ 0 = 1
  0 ^ 1 * 0 ^ -1 = 0 ^ 0  si ha che 0 ^ -1 impossibile perche'
divisione per zero, 0 ^ 0 indeterminato perche' non c'e' operazione
che permetta di calcolarlo
quindi io cambierei il blocco
         '^': If (Num1=0) And (Num2=0) Then
              Begin
                Result:=0;
                Error:='Founded 0^0.';
              End
in
         '^': If (Num1=0) And (Num2<=0) Then
              Begin
                Result:=0;
                Error:='Zero with bad exponent.';
              End
Vi faccio i miei complimenti per il programma, che mi sembra
interessante e ben fatto.
"Siamo polvere di stelle che rimane a bocca aperta allo splendore
delle stelle del firmamento", Carl Sagan.


Ritiro la mia osservazione sul punto (1)  poiche' 
  2 <spazio> 3 fornisce 23
ma
  2 <spazio> (3) fornisce 6
e va bene cosi', scussssate.


Correzione alla mia osservazione sul punto (2): in modo da evitare un
errore quando si cerca la potenza di un valore negativo con un
esponente frazionario, cioe' una radice con un eventuale grado pari
di un numero negativo che e' appunto impossibile. Quindi modificherei
il blocco di cui sopra in
         '^': If Num1=0 Then
                Begin
                  Result:=0;
                  If Num2<=0 Then Error:='Zero with bad exponent.';
                End
                        Else
                If Num1<0 Then 
                  If Num2=Int(Num2) Then
                    Result:=Esp(Num1,Num2)
                                    Else            
                      Begin
                        Result:=0;
                        Error:='Cannot calculate exponential.'; 
                      End
                Else Result:=Exp(Num2*Ln(Num1));
Fine (spero).

accetta finalmente prodotti impliciti.
Well done!
Io l'ho compilato con il DevPas, e posso aggiungere che:
non PUOI andare a capo quando scrivi una stringa.
Vale "Errore fatale".
La variabile Abskind č inizializzata, ma non utilizzata. (?)
Bene, comunque sono modifiche da poco.
Io ora mi occupo della funzione "history".
Ah, guarda questo:
---{begin quote}
PAS> 45!
45!
 1.1962222086548019E+0056
57.20
PAS>
---{end quote}
"FORSE" bisogna fare qualcosa per il bug con la notazione
scientifica...
---
Ciao
PV

Altra imperfezione, quando si digita
  Pas> 1.008
  1.008
il numero non viene arrotondato a 2 cifre, ho provato a inserire in
#0: Begin
               If Num1=Int(Num1) Then Prec:=0 Else Prec:=2;
               Str(Num1:0:Prec,Express);
               Solve_Exp:=False;
               Exit;
             End;
una linea
  Result:=Num1;
ma non ottengo l'effetto sperato.


Non è un'imperfezione: non trovando nessuna operazione da eseguire,
PasMath non fa niente.
Ed evitare una perdita di precisione non si considera mai errore. ;-)
---
Ciao
PV

PV
O-Kappa, capito.
Sto cercando di capire un po' il codice, e mi sfugge il significato
nella funzione Solve_Exp nella parte che gestisce il fattoriale del
controllo
If (Expr[Pos1-1]=']') Then
              Begin
                Error:='Cannot calculate factorial.';
                Solve_Exp:=True;
                Exit;
              End;
siccome le parentesi quadre non sono considerate nel programma. Please
help me! Ciao.

 nel programma. Please help me!
Semplicemente la procedura Solve_Brackets
ogni qualvolta viene calcolato il valore di una
sottoespressione tra parentesi (o valore
assoluto) effettua il seguente controllo:
If Pos1<Length(Expr) Then
   If (Expr[Pos1+1] In ['^','!']) And (SubExpr[1]='-')
      And Not Abs Then SubExpr:='['+SubExpr+']';
In pratica se il risultato dell'espressione e'
negativo essa non si limita a togliere le
parentesi tonde, ma se al di fuori della
parentesi vi e' un segno di fattoriale o
di elevazione a potenza, allora delimita
il risultato tra parentesi quadre (ignorate
dalla funzione Solve_Brackets, che si
occupa solo delle tonde e dei valori assoluti).
Questa delimitazione e' necessaria per
far si' che durante il calcolo dell'elevazione
a potenza (che avviene all'interno di
Solve_Expr) si tenga conto anche del
segno negativo. Per il fattoriale (il caso
qui sopra) se viene riscontrata una
parentesi quadra allora, essendo il
numero negativo, viene restituito un
errore in quanto si possono calcolare
solo fattoriali di numeri interi positivi.
Se ci fai caso esiste una funzione
NoSquare che nasconde le parentesi
quadre all'utente.
Ciao, Carmelo.

 Fine (spero).
Ti ringrazio molto per il contributo. Vorrei
farti notare pero' che la soluzione da te
proposta impedisce anche di calcolare
le radici dispari di numeri negativi.
Occorrerebbe invece controllare che
l'inverso dell'esponente non sia pari.
Ciao, Carmelo

 con la notazione scientifica...
Ero gia al corrente di questo problema.
Per ora l'ho risolto (non in questa versione)
restituendo un fittizio errore di "Overflow"
quando si oltrepassano le 35 cifre. Per il
futuro penso gia ad una soluzione diversa
(ovviamente un po' piu' complessa), che
non intacchi la potenza di calcolo.
Ciao, Carmelo.

 essere richiesto proprio per separare le istruzioni,
beh.. e' vero per le istruzioni, ma lui diceva stringhe
Nel 99% dei compilatori se inizi una stringa su
una riga e la finisci su un'altra ottieni un errore:
se si vuole inserire un ritorno a capo si usa la
combinazione tipica del SO (#13#10 per il tp)
--
Dreadnaut
(Life would be easier if I had the source code)

Ciao, Carmelo
Hai ragione, se trovo un po' di tempo estendo la soluzione, cmq in
effetti come hai detto tu basta prevedere un ulteriore caso in cui si
controlla se l'inverso e' dispari e la base negativa
  If (Round(1/Num2) Mod 2 <> 0) And (Num1<0) Then
Result:=-Exp(Num2*Ln(Abs(Num1)));
Ciao, Marco.

Grazie per la risposta!

 combinazione tipica del SO (#13#10 per il tp)
Beh, visto che non mi pare di aver fatto nulla
del genere, vorrei sapere quale sia la stringa
incriminata. Forse l'Outlook ci ha messo del suo.
Ciao, Carmelo.

> Forse l'Outlook ci ha messo del suo.
penso di si'... di default tronca le righe a 120
caratteri +/-
