Supprimer le E

maxioutils Messages postés 69 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 22 juin 2007 - 10 nov. 2005 à 22:05
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 13 nov. 2005 à 22:39
Bonjour euh je pourai savoir comment supprimer le E scientifique dans le résultat d'un calcul en Delphi ?

19 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
10 nov. 2005 à 22:21
salut

pour passer en affichage normal par exemple pour limiter le nombre de decimales à 2 chiffres:

uses math;

procedure TForm1.FormCreate(Sender: TObject);

begin

edit1.Text:=FloatToStrF(value,TFloatFormat(ffFixed),10,2);

end;

bonne prog

@+

jlen
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
10 nov. 2005 à 22:51
Si tu viens du monde C, il existe aussi la commande Format. Elle a une syntaxe extrêment proche.



Loda
0
maxioutils Messages postés 69 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 22 juin 2007
11 nov. 2005 à 15:50
euh non désolé je ne vienspas dumondet ce n'est pas ça que je veuxmoi, moi je voudrai juste exemple ovila mon calcule :
2356468744585 * 8487454

et la réponse on va dire 7.56464E8 et bien comment enlever le E et afficher le résultat en entier merci
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 nov. 2005 à 16:03
var

valeur:extended;

valeur:= 2356468744585 * 8487454; //provoque un debordement

valeur: =235646.8744585 * 8487454;

edit1.text:=inttostr (trunc(valeur));//affiche 200004200721@+

jlen
0

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

Posez votre question
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 nov. 2005 à 16:06
tu peux auusi faire:

edit1.text:=inttostr (round(valeur)); qui arrondi à la valeur la plus proche
0
maxioutils Messages postés 69 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 22 juin 2007
11 nov. 2005 à 16:13
Ah ok maisle problemec'est que avec mon truc c'est que j'ai 2 Edit.Text. Et un button1. Voila et moi je dois entrer la valeur dans edit1.text et la valeur converti doit sortir dans edit2.text entieremen. et quand jeemt que valeur:=edit1.text ilme dit que string et extended sont incompatible ça c'est normal alors je voudrai savoir comment faire maintenant emrci deton aide très sympa.
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 nov. 2005 à 16:33
c'est normal puisque j'ai déclaré valeur en exentended et que text est un string il faut convertir la valeur en string.

pour passer d'une saisie dans l'edit1 à un affichage dans l'edit2

1 er cas si tu rentres 2356468744585 * 8487454 dans l'edit1 tu devras
passer par une fonction qui convertiras ta chaine (text de l'edit1) en
plusieurs termes puis calculera le resultat. (genre éditeur de
fonctions) et enfin le convertira en chaine pour l'afficher dans l'edit2

2ème cas (plus simple) tu fais un genre de calculette:

-saisie du 1er chiffre

-saisie de l'opérateur

-calcul du resulat

faafichage du résultat.

3eme cas l'edit1 contient le resulat de l'opération

il faut faire en decomposant c'est plus simple à comprendre:

valeur:= strtofloat(edit1.text);

puis convertir la valeur en chaine apres avoir reduit valeur à un entier

dans le cas de trunc ou de round la fonction renvoie un integer d'ou
l'utilisation de inttostr() qui converti un entier en chaine

@+

jlen
0
maxioutils Messages postés 69 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 22 juin 2007
11 nov. 2005 à 16:39
ahok masi sauf que là je suis débutant donc pour bien ecrirece code j'aurai unpeu de mal merci de ta réponse
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 nov. 2005 à 16:43
pour répondre à ton autre post pour les nombres"à virgule"--> flottants

il faut utiliser

edit1.Text:=FloatToStrF(value,TFloatFormat(ffFixed),10,2);

ou 10 est la precision de calcul (on peut aller jusqu'à 18 pour un double ou un extended)

et 2 est le nombre de chiffres affichés après la virgule.

@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 nov. 2005 à 16:45
si tu debutes commence par la calculette c'est beaucoup plus simple que l'éditeur de fonction

@+

jlen
0
maxioutils Messages postés 69 Date d'inscription mardi 1 février 2005 Statut Membre Dernière intervention 22 juin 2007
11 nov. 2005 à 17:14
Sans te déranger ne pourrai tu pas me montrer le code sans te déranger j'espere que ce n'est pas trop merci. Car en faite je voudrai convertir un nombre en
10 puissance -24c'est pour cela alors jevoudrai que le résultat soit 0.0000... etnon avec un E
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 nov. 2005 à 17:16
tiens juste pour jouer un petit bout de code d'un mini éditeur de
fonction (4 opérations et pas de gestion des exeptions: attention aux
erreurs de saisie elles provoqueune erreur d'exécution.-->seperateur
decimal= = ','

procedure TForm1.Button1Click(Sender: TObject);

var v1,v2:extended;

str1,str2:string;

i:integer;

operateur:char;

begin

for i: =1 to length(edit1.Text) do

begin

if edit1.Text[i] in ['+','-','*','/'] then

begin

str1:= copy(edit1.Text,1,i-1);

v1:=strtofloat(str1);

operateur:= edit1.Text[i];

str2:= copy(edit1.Text,i+1,length(edit1.Text)-i);

v2:=strtofloat(str2);

// edit2.Text:=str2;

case operateur of

'+': v2: =v1+v2;

'-': v2:= v1-v2;

'*': v2:=v1*v2;

'/': v2:=v1/v2;

end ;

edit2.Text: =FloatToStrF(v2,TFloatFormat(ffFixed),10,2);

break;

end;

end;



end;

ça peut te servir de base

@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 nov. 2005 à 17:25
salut tu ne peux pas afficher un nombre 10 ^-24 en effet le nombre de
chiffres significatifs maximum est de 18 or dans ton cas il faudrait
qu'il soit au minimum de 25. Tu ne peux donc le représenter que sous
forme de notation scientifique.

@+

jlen
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
11 nov. 2005 à 22:26
Bien sur que si on peut, mais ca impose de ruser : splitter en milliers sur le principe de :

MyBigNumber:= A[0] + 1000*A[1] + 1000000*A[2]+.......

Ce qui reveint a stocker N nombres à 3 chiffres...

Ca impose de repenser la manière de calculer et pour l'affichage
Label.caption:='';
for i:= Amax downto 0 do
Label.caption:= intostr(A[i]+Label.caption

gnh !
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
12 nov. 2005 à 00:35
deltafx--> le probleme c'est que tu ne peut pas stocker
plus de 18 chiffres significatifs sur 64 bits
(9223372036854775808';//2^63 le 64° bit etant le bit de signe) et que
tu si tu veux calculer sur 24 chiffres significatifs tu devras passer
en 96 ou 128 bits or il faudra passer par l'ASM et réécrire le
fonctions mathematiques dont tu as besoin.

Fais un test sur se que tu donnes et il y a fort à parier qu'à un
moment tu seras en overflow quand le résultat dépassera 18 chiffres
significatifs. (tout du moins tu repasseras en float)

d'ailleurs il suffit de consulter l'aide pour constater:

pour les types reels elle donne:

Real48 2.9 x 10^-39 .. 1.7 x 10^38 Chiffres significatifs 11-12 6

Single 1.5 x 10^-45 .. 3.4 x 10^38 Chiffres significatifs 7-8 4

Double 5.0 x 10^-324 .. 1.7 x 10^308 Chiffres significatifs 15-16 8

Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 Chiffres significatifs 19-20 10

Comp -2^63+1 .. 2^63 -1 Chiffres significatifs 19-20 8

ceci explique que la convertion ne puisse depasser 18 chiffres (le 19 eme n'allant pas de 0..9)

et entre nous essayer de lire ce chiffre:0,0000000000000000000000005236841.

maxioutil--> si tu tiens vraiment a afficher ce genre de nombre converti en chaine ce qui te donneras:

'7,56464E-24'

la tu extrais la chaine avant le E

tu supprimes la vigule ---> mantisse

tu extrais l'exposant (-24 converti en integer)

chainefinal:='0,'+StringOfChar(0,exposant)+mantisse;

voila pas besoin de passer par l'arithmetique 128bits

ce n'est pas tres simple mais ça marche

@+

jlen
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
12 nov. 2005 à 22:54
Je crois que t'as pas compris jlen : ma methode ne stoche que des
entiers inférieur a 1000 donc sur 3 chiffres uniquement. Le coup de
multiplier par 1000, 1e6, 1e9 c'est juste pour illustrer mon propos, ce
calcul n'est jamais fait.



C'est pour ca que je disais qu'il faut repenser la maniere de faire les opération : un simple plus

avec

A= 1500265 on a A0=265, A1=500, A2=1; et

B=25123458 on a B0= 458, B1=123, B2=25



Et le calcul se fait (en pseudo code)

for I:=0 to Max(Ai, Bi) do

begin

C[i]:= A[i] + B[i];

if C[i] > 999 then // on pose une retenue. c'est loin hein ;)

begin

A[i+1]:=A[i+1]+Trunc(C[i]/1000);

C[i]:= C[i] - Trunc(C[i]/1000);

end;

end;



Et hop, tu geres comme ca des trucs en précision absolu (12
millions de chiffres significatifs apres la virgule, si ca te chante)




Gnh.... plouf !
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
12 nov. 2005 à 23:21
ok avec toi mais tu veux un peu d'efficacite il faudra passer par
l'assembleur sinon bonjour les temps de calcul et dans ce cas il n'est
pas sur que cela soit plus simple que de passer en arithmethique
128bits (4*32bit) plus adaptée à l'architecture du processseur
(he oui c'est quand meme du binaire)que l'arithmetique decimal.

et ce q'il cherche ce n'est pas la precision de calcul mais l'affichage de zero entre le nombre et la virgule.

Si son resultat vient d'une operation complexe et qu'il ne s'agit que
d'un affichage il vaut mieux travaillé directement sur la chaine
surtout que le floatostr donne le nombre de chiffres avant ou apres la
virgule (2 copy,une convertion) .

@+

jlen
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
13 nov. 2005 à 22:16
Ben evidement !... Quoi que Pi avec 175000 decimale en Rpn sur Hp48 (proc Saturn 4 bit) ca tournait bien,

Clair qu'en assembleur ca sera rapide.

Ah le bon temps où je pouvais déclarer mes reels en Real *8, en fortran77.

gnh !
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
13 nov. 2005 à 22:39
quoique si tu as la nostalgie tu fais comme un peu de C (pas de c++ non
non du bon vieux C) ou l'ASM sur microcontroleur avec 4 ko de Ram et
8ko d 'EEPROM --> pas question d'utiliser la lib "maths" Mais comme
j'ai commencé sur un ZX81 avec...1ko de ram .... ou un peu apres sur PC
avec les applis dos (quoique pour certaines applis je regretteai
presque le vieux DOS au moins on pouvait adresser les ES maintenant
c'est une vraie galere,et avec windows qui reprend la main quand il
veut impossible de faire des timmings)

@+

jlen
0
Rejoignez-nous