NOMBRES FLOTTANTS

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 18 déc. 2004 à 11:21
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 - 20 déc. 2004 à 09:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/28243-nombres-flottants

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
20 déc. 2004 à 09:51
Hello delphiprog,

Sympa ton code et à chaque fois que je lis un de tes codes j'apprends des choses lol. Tu m'épateras toujours.
Sinon ce n'est pas exactement ce que nous recherchions avec Mauricio. Nous ce que voudrions c'est savoir le nombre de caractère maximum d'un champ déclaré en integer ou en floattant dans une base sans lire tous les enregistrements.
Je te remercie de penser à nous. Si tu as une idée pour notre souci ...

Bonne prog,
JMP77.
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
19 déc. 2004 à 18:14
Comme tu peux le voir, je n'ai que les versions impaires. Tu pourras donc toujours me coincer avec celles qui sont paires. D7 me sert juste à ouvrir tous vos codes. La version 3 est totale révolutionnaire... Mais en fait, c'est plus subtile que ça. Chut !
Il y a un probleme au niveau de l'explication.

Si on met un nombre entier dans l'edit, on obtiont par exemple 5 * 10^-2 50 ou pire 12 * 10^-2 12.

Il y a comme un probleme....

PS : booleans: array[boolean] of string = ('non', 'oui');
Ce qui me fait marrer, c'est le commentaire de la ligne du dessus : INTERNATIONALISATION DES CHAINES !!!!!

TryStrToFloat existe sous Delphi 6.
n'est-ce-pas grandvizir qui refuse absolument de lacher sa version 3. toi qui dit pourtant dans ton commentaire perso que tu a la version 7.
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
19 déc. 2004 à 10:13
Sans vouloir être méchant, je trouve ce code un peu décevant par rapport au grand potentiel de DelphiProg pour faire des applications de ouf, lui qui en sait tant. Je me réserve donc en attendant...

Toutes précisions sont bonnes à entendre. En l'occurrence ici, j'ajoute que sa fonction TryStrToFloat ne débarque que depuis Delphi 7.

Et sinon, en ce qui concerne mes logs, je dirais qu'il serait plus court de passer par StrToFloat et Pos, que de s'amuser à faire des logarithmes, des valeurs absolues et des conditions IF...
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
19 déc. 2004 à 07:45
Effectivement, concernant le nombre de chiffres significatifs, c'est bon, je n'ai jamais eu de doute à ce sujet, Delphiprog a toujours bien programmé

(j'amenais juste une précision sur un format de notation dont on parle rarement mais qui est important pour notre compréhension).

Delphiprog met un lien sur les IEEE qui explique aussi ce format à voir absolument pour ceux qui voudraient un complément d'info.


Dans le syle array, moi aussi j'ai bien aimé aussi le :

booleans: array[boolean] of string = ('non', 'oui');
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
18 déc. 2004 à 20:07
«Le seul objectif était de connaitre le nombre de chiffres significatifs situés avant le point décimal et rien d'autre.» Ma technique vaut ce qu'elle vaut. Je n'étais pas là pour la question du forum qui a inspiré ce code.

Si le array[boolean] ne me surprend pas du tout, c'est uniquement parce qu'il faut le comprendre comme un array[false..true], ce qui est basé sur le même principe que array[0..1].
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
18 déc. 2004 à 19:05
c'est intéressant mais ce n'est pas ça qu'on appelle exposant et mantisse en informatique, j'ai beaucoup travaillé sur IEEE 32 bits et 64 bits, je propose de regarder les liens qui expliquent cela, j'avais fait un source à ce sujet me donnant une suite binaire à partir d'un float codé en IEEE 32 bits, j'ai testé avec mon programme et ceux qu'on trouve sur internet, je pense qu'il y a confusion donc je vous donne un lien ou vous avez entre autre ce genre de manipulation (en anglais, espagnol pour ce coup ci mais il y a d'autres sites qui l'explique en français :

http://www.nuvisionmiami.com/books/asm/workbook/floating_tut.htm

une autre adresse (en espagnol) http://www.zator.com/Cpp/E2_2_4a.htm

Le fameux convertisseur s'y trouve on peutl'essayer directement en allant au paragraphe "§8.3.5 Convertidor automático de formatos" et vous cliquez au lien "Convertidor"

effectivement on peut s'amuser royalement à comprendre le système IEEE qui est la base de nos PC ;)
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
18 déc. 2004 à 17:35
Une petite séance de maths sera la bienvenue, me semble-t-il, car les logarithmes vous ont manifestement laissé sur la touche.

Soit X le nombre décimal dont on veux chercher le nombre de chiffres significatifs. Le programme suivant est une ébauche.

program Review;
uses SysUtils;
implementation
function Log(X:real):real;
begin
log:=ln(x)/ln(10);
end;
begin
X:=|X|; //valeur absolue, abs(X)
if X<1 then NbSignif:=0
else NbSignif:=Trunc( log(X) + 1 );
end.

Rappel sur le logarithme décimal (base 10 et non base e=2,7182818.... qui serait alors le logarithme népérien):
log(1)=0
log(10)=1
log(100)=2
...
log(10^n)=n

D'où on déduit en prenant un exemple
log(150)
= log(100) + UneCertaineQuantité
= 2 + QQCH (QQCH strictement inférieur à 1)
En ajoutant 1 à 2 et en prenant la partie entière (ou la troncature), on obtient 3. N'est-ce pas ce qu'on voulait ? On a ici pas utilisé de conversions.

Après on peut s'amuser royalement.
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
18 déc. 2004 à 13:46
Salut,

en IEEE 32bits (qui existe aussi en 64 bits)qui sont les normes utilisées pour les floats sur nos PC

pour 123,456789 :

le signe est :0
l'exposant est :6
la mantisse est :1,929012328125

je peux te détailler la méthode de calcul au besoin

je ne comprends pas quelle norme tu as utilisée, pourrais tu préciser , merci ? ;)
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
18 déc. 2004 à 13:19
oui c sur ke avec la " , " " . " pis fo effectivement transformer en string.
je savais pas non plus ke ça venais d'une demande de ces gens tres actifs en ce moment :p

ouèouè ce booleans en array là, j'en suis tout retourné, ça va me faire modif des sources ça !! :D merki merki :D
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 déc. 2004 à 13:12
Je suis d'accord avec toi JulioDelphi. Mais pour cela, il faut transformer le nombre réel en chaine d'abord.
Or, ce que demandaient Mauricio et jmp77 c'était de pouvoir connaitre le nombre de chiffres significatifs sans faire de transformation au préalable.
De plus, je te rappelle que la position du séparateur décimal (et pas seulement du caractère '.') n'est pas la seule chose à prendre en compte. Il faut aussi tenir compte du signe.
Je suis content de t'avoir bluffé ;o)
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
18 déc. 2004 à 11:21
pour trouver le nb de chiffres avant le point j'aurais fait un pos('.',valeur)-1 lol

ce qui m'a bluffé c'est le booleans: array[boolean] of string = ('non', 'oui'); :O

je viens d'en apprendre une bonne :p
Rejoignez-nous