Oppure

Loading
06/01/10 13:14
Ciao a tutti. Ho il seguente problema:
Sto tentando di costruire una calcolatrice con alcune funzioni scientifiche (quali seno, coseno e tangente) però danno dei problemi di compatibilità.
I codici che metto nei bottoni Coseno e Seno sono i seguenti:
COSENO
procedure TForm1.CoseClick(Sender: TObject);
var num: real;
begin
num:= StrToFloat(Edit1.Text);
  If Radianti.Checked = True Then
    begin
      num:= Cos(num);
      Edit1.Text:= FloatToStr(num);
    end;
  If Gradi.Checked = True Then
    begin
      num:= ((num * Pi) / 180);
      num:=Cos(num);
      Edit1.Text:= FloatToStr(num);
    end;
end;


SENO
procedure TForm1.SenClick(Sender: TObject);
var num:real;
begin
num:= StrToFloat(Edit1.Text);
If Radianti.Checked = True then
  begin
    If Radianti.Checked = True then num:= Sin(num);
    If Gradi.Checked = True Then num:= Sin((num* Pi)/180);
    Edit1.Text:= FloatToStr(num);
  end;
end;


Quando provo il programmino, l'operazione va bene per Cos(Pi) che come ci si aspetta mi da -1, mentre se provo Cos(Pi/2) che dovrebbe darmi 0, mi risulta -3,49148336110938E-15.
Così allo stesso modo, Sin(Pi/2) risulta tranquillamente uguale a 1, mentre Sin(Pi) che dovrebbe darmi 0 mi risulta 3,23108510433268E-15.
Tutto questo per i radianti. Mentre se cambio a Gradi, i risultati errati cambiano e più precisamente sono doppi di quelli avuti con i radianti (ovviamente nei Gradi non ho usato Pi e Pi/2 ma 180 e 90).

Sapreste darmi una risposta?
Grazie mille in anticipo
06/01/10 14:40
nessuno
Il valore ottenuto è corretto, anche se soffre delle approssimazioni della rappresentazioni in virgola mobile. Diciamo che è molto vicino allo zero.

Ti conviene rappresentarlo dopo averlo approssimato ad un certo numero di cifre dopo lo zero (che so, 8 ...). Così otterrai 0.

Naturalmente, essendo l'argomento in radianti, non puoi passare dei gradi ... avrai risultati sballati.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
06/01/10 15:56
Ho capito. Come faccio a usare un approssimazione di 8 cifre invece di quelle usate di default dal pc?
06/01/10 16:08
nessuno
Intendo che tu debba usare una approssimazione in "visualizzazione" ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
06/01/10 17:06
Ovverosia? Riusciresti a farmi un esempio?
06/01/10 17:44
nessuno
Non uso il Delphi ma presumo ci sia una funzione che possa mostrare un valore numerico nel textbox con un certo numero di cifre fisse.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
11/01/10 13:43
Sono riuscito a trovare il modo per arrotondare (RoundTo, grazie a voi del forum), però ho incontrato di nuovo un errore:
Le funzioni seno e coseno vanno alla perfezione sia in gradi che in radianti. Inserendo anche le funzioni inverse (ArcSen e ArcCos) però esse funzionano solo per i radianti.

Il procedimento che io adotto è il seguente:
1) Leggo il numero nello schermo.
2) Dato che è in radianti lo trasformo in gradi mediante la relazione num:= (num*Pi)/180
3) Metto in OutPut la funzione ARCSIN(num)

Ecco il codice:
num:= StrToFloat(Edit1.Text);
If FunzioniInverse.Checked = False Then
begin
  If Radianti.Checked = True Then
    begin
      num:= Sin(num);
      Edit1.Text:= FloatToStr(RoundTo(num,-8));
    end;
  If Gradi.Checked = True Then
    begin
      num:= ((num * Pi) / 180);
      num:= Sin(num);
      Edit1.Text:= FloatToStr(RoundTo(num,-8));
    end;
end
Else
begin
  If Radianti.Checked = True Then
    begin
      num:= ArcSin(num);
      Edit1.Text:= FloatToStr(RoundTo(num,-8));
    end;
  If Gradi.Checked = True Then
    begin
      num:= ((num * Pi) / 180);
      num:= ArcSin(num);
      Edit1.Text:= FloatToStr(RoundTo(num,-8));
    end;
end;


Lo stesso è il codice per il coseno...
trovate qualche errore per caso?
11/01/10 14:37
nessuno
Un attimo ... forse stai facendo un po' di confusione.

L'arcoseno non ha argomenti ne' in radianti ne' in gradi.
Accetta un argomento compreso tra -1 e 1 e restituisce il valore in radianti.

Lo stesso per l'arcocoseno.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.