Racine carrée help

cs_cricri_forever Messages postés 49 Date d'inscription mercredi 28 septembre 2005 Statut Membre Dernière intervention 31 mars 2006 - 9 févr. 2006 à 02:57
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 10 févr. 2006 à 08:28
bonjour,

quelq'un pourrait m'aider a la transformation du code en delphi... je débute


#include <vcl.h>
#pragma hdrstop
#include<stdlib.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ }
//---------------------------------------------------------------------------
void __fastcall TForm1::CalculClick(TObject *Sender)
{
float nombre, resultat, resultat0, test;
int n=0;
nombre = StrToFloat(Edit1->Text);
resultat=(1+nombre)/2;
do
{
resultat0=resultat;
resultat=(resultat0+nombre/resultat0)*0.5;
n=n+1;
test=(resultat-resultat0)/resultat0;
if (test<0) test=-test;
}
while(test>0.0001);
Edit2->Text = FloatToStr(resultat);
Edit3->Text = IntToStr(n);
}

8 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
9 févr. 2006 à 08:40
salut,

les déclarations de header peuvent être oubliées (delphi mets les clauses uses dont il a besoin

pour la procedure cela donne:



procedure TForm1.BitBtn1Click(Sender: TObject);

var nombre, resultat, resultat0, test : real ;//ou double

n:integer;

begin

nombre := StrToFloat(Edit1.Text);

resultat:=(1+nombre)/2;

repeat

resultat0: =resultat;

resultat:= (resultat0+nombre/resultat0)*0.5;

inc(n);

test:=(resultat-resultat0)/resultat0;

if (test<0)then test: =-test;

until(test>0.0001);

Edit2.Text := FloatToStr(resultat);

Edit3.Text := IntToStr(n);



end;



@+

jlen
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 11:03
Salut,
jlen il me semble qu'il manque juste une petite chose certe mais qui va changer totalement le résultat de n :

procedure TForm1.BitBtn1Click(Sender: TObject);
var nombre, resultat, resultat0, test : real ;//ou double
n:integer;
begin
n := 0;
nombre := StrToFloat(Edit1.Text);
resultat:=(1+nombre)/2;
repeat
resultat0: =resultat;
resultat:= (resultat0+nombre/resultat0)*0.5;
inc(n);
test:=(resultat-resultat0)/resultat0;
if (test<0)then test: =-test;
until(test>0.0001);
Edit2.Text := FloatToStr(resultat);
Edit3.Text := IntToStr(n);
end;

Bon en suite cricri_forever ta question est : Racine carrée help :


Ce code à mon avis ne donne pas la racine carrée d'un nombre
pour ce faire il existe une fonction qui est :

function Sqrt(const X: Extended): Extended;

@+
Cirec
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
9 févr. 2006 à 11:16
cirec --> d'accord c'est vrai que les variables locales ne sont pas initialisées à 0 par défaut!!



@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
9 févr. 2006 à 11:32
au fait dans ce code est plus un exercice de style pour voir en combien
d'itération on arrive au résultat qu'une façcon efficace de calculer
une racine carrée.



sinon c'est bien un algorythme de cacul de racine carrée par approximations successives



j'ai d'ailleurs mal converti le do.. while en repeat.. until

avec while on repete tant que test>0.0001 et avec repeat on répete juasqu'à ce test<0.001!!

il faut donc inverser le test ce qui donne:

procedure TForm1.BitBtn1Click(Sender: TObject);

var nombre, resultat, resultat0, test : real ;//ou double

n:integer;

begin

n:= 0;

nombre := StrToFloat(Edit1.Text);

resultat:=(1+nombre)/2;

repeat

resultat0: =resultat;

resultat:= (resultat0+nombre/resultat0)*0.5;

inc(n);

test:=(resultat-resultat0)/resultat0;

if (test<0)then test: =-test;

until(test<0.0001);

Edit2.Text := FloatToStr(resultat);

Edit3.Text := IntToStr(n);



end;

@+

jlen
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 févr. 2006 à 11:58
Ah oui la ça change tout
le résultat est maintenant bien la racine carrée du nombre donné dans Edit1
moi je n'ai pas décortiqué la procédure, n'ayant pas été en classe à l'école,
je me suis contenté de la tester et le résultat n'était pas celui que j'attendais
mais la tout est rentré dans l'ordre c'est parfait.

@+
Cirec
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
9 févr. 2006 à 12:13
c'est un des pièges des convertions de C en delphi et inversement . En
travaillant simulatnément sur les 2 langages je devrais le savoir mais
je me fais régulièremnt pièger

note si tu refais le test la précision dépend de la valeur que tu donne
pour la sortie --> plus l'epsilon (accuracy pour parler
anglais) sera faible meilleure sera la précision et plus le nombre
d'itération sera élevé.

@+

jlen
0
cs_cricri_forever Messages postés 49 Date d'inscription mercredi 28 septembre 2005 Statut Membre Dernière intervention 31 mars 2006
10 févr. 2006 à 02:30
var nombre, resultat, resultat0, test : real ;//ou double

quel difference se presente avec real ou double?
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
10 févr. 2006 à 08:28
salut

Le type générique Real est équivalent, dans son implémentation actuelle, au type Double.

mais tu peux le déclarer extended pour une meilleure précision



@+

jlen
0
Rejoignez-nous