Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1661 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [c]Code format d'un double %f ou %lf ? Ou avoir + d'info sur long?

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[c]Code format d'un double %f ou %lf ? Ou avoir + d'info sur long?

n°748379
weed
Posté le 02-06-2004 à 01:56:13  profilanswer
 

bon je suis un peu perdu  
 
Taz m'avais dis %f et le man 3 printf l'a comfirmé  
 
or le C que j'ai appris et sur le site  http://www.iota-six.co.uk/c/c2_printf_and_scanf.asp, c'est %lf !!!!
 
 
deplus d'apres le man, le float a completement disparu ....
 
bon normallement je dois plutot croire le man de mon syteme  
 
j'etais au courant a propos des int qui pouvait prendre soit 2 ou 4 octets  
mais la bizzare, ca me surprends .....
 
 
sinon comment puis je savoir sur combien de bits sont les int sur mon systeme, y a t'il une page man ?  
je dois pouvoir utiliser des nombre de 0 à 2 ^(32) -1  
donc normallement ca passe juste juste en non signé mais je pense utiliser des long pour etre tranquille mais quel code format utilisé ? %l ???
 
 
 
 

Citation :

MODIFICATEUR DE LONGUEUR
       Ici, une conversion entière correspond à d, i, o, u, x, ou X.
 
       hh     La conversion entière suivante correspond à un  signed  char  ou
              unsigned char, ou la conversion n suivante correspond à un argu-
              ment pointeur sur un signed char.
 
       h      La conversion entière suivante correspond  à  un  short  int  ou
              unsigned  short int, ou la conversion n suivante correspond à un
              argument pointeur sur un short int.
 
       l      (elle) La conversion entière suivante correspond à un  long  int
              ou  unsigned  long int, ou la conversion n suivante correspond à
              un pointeur sur un long int, ou la conversion c suivante  corre-
              spond  à  un argument wint_t, ou encore la conversion s suivante
              correspond à un pointeur sur un wchar_t.
 
       ll     (elle-elle) La conversion entière suivante correspond à un  long
              long int, ou unsigned long long int, ou la conversion n suivante
              correspond à un pointeur sur un long long int.
 
       L      La conversion a, A, e, E, f, F, g, ou G suivante correspond à un
              argument long double.  (C99 autorise %LF mais pas SUSv2).
 
       q      (`quad'  BSD 4.4 et Linux sous libc5 seulement, ne pas utiliser)
              Il s'agit d'un synonyme pour ll.
 
       j      La conversion entière suivante correspond à un argument intmax_t
              ou uintmax_t.
 
       z      La  conversion  entière suivante correspond à un argument size_t
              ou ssize_t.  (La bibliothèque libc5 de Linux  proposait  l'argu-
              ment Z pour cela, ne pas utiliser).
 
       t      La   conversion   entière  suivante  correspond  à  un  argument
              ptrdiff_t.


je suis assez impressionné par le nombre de type de valeur qui existe sur mon systeme  
h => short int  
I => long int  
ii => long long int
L => long double
 
je pense que c'est un long int qui me faudrait mais comment connaitre les plges de nombre que je peux utiliser ou sinon la taille des variables.  N'existe t'il pas de page man pour avoir un peu plus de precisions ?


Message édité par weed le 02-06-2004 à 01:57:01
mood
Publicité
Posté le 02-06-2004 à 01:56:13  profilanswer
 

n°748381
vivelec
Posté le 02-06-2004 à 02:08:45  profilanswer
 

Pour un double c'est %f qui est utilisé, le 'l' n'est applicable que sur des entiers et est ignoré.
Pour connaître le nombre d'octets, tu peux utiliser sizeof().
Sinon, généralement sur unix de nos jours et sauf erreur de ma part, les longs et int sont sur 32, les long long sur 64, les short sur 16.
Tu peux aussi utiliser les séries int64, int32, int16 ...

n°748385
matafan
Posté le 02-06-2004 à 02:31:34  profilanswer
 

En général (ce qui ne veux rien dire) les long sont 32 si compilés en 32 bits, et 64 si compilés en 64 bits. En général toujours, les int font 32 bits et les long long 64 bits, quel que soit le mode.
 
Pour connaître la taille en bits d'un type, fait « sizeof (type) * CHAR_BIT » (et oui, un char ne fait pas forcément 8 bits). Si tu veux juste savoir la plus grande quantité que peux contenir un type de base, utilise les INT_MAX, UINT_MAX...
 
Tout ça est dans limits.h et dépend de l'architecture.
 
Ah et puis pour réponde à ta question, ce n'est pas %l pour les long mais %ld ou %lu, suivant que tu veux du signé ou non signé. Et pour long long c'est %lld ou %llu. Les « l » et « ll » sont des modificateurs qui s'insèrent avant le type qui suit :D (d, u, x, X).


Message édité par matafan le 02-06-2004 à 02:34:56
n°748389
weed
Posté le 02-06-2004 à 02:42:58  profilanswer
 

int32 t; n'a pas l'air de trop passer ...

Citation :

amusant/client.c:259: error: `int32' undeclared (first use in this function)
amusant/client.c:259: error: (Each undeclared identifier is reported only once
amusant/client.c:259: error: for each function it appears in.)
amusant/client.c:259: error: parse error before "t"


 
 
je viens de faire un petit sizeof vite fais et en effet tu as raison  
int et long => 32
long long => 64
mais alors a quoi ca sert le int ?
les bornes de int et de long sont bien  
0 -> 2^32 en non signé
ou en signé de - 2^32/2 -> 2^32/2

n°748390
weed
Posté le 02-06-2004 à 02:44:36  profilanswer
 

oulala je me suis fais grilled
je regarderais ca demain  
merrci pour vos reponses

n°748393
matafan
Posté le 02-06-2004 à 04:31:14  profilanswer
 

Code :
  1. #include <sys/types.h>


Message édité par matafan le 02-06-2004 à 04:31:34
n°748401
Taz
bisounours-codeur
Posté le 02-06-2004 à 07:15:40  profilanswer
 

vivelec a écrit :

Pour un double c'est %f qui est utilisé, le 'l' n'est applicable que sur des entiers et est ignoré.


 
weed > en fait, c'est simple, c'est juste que le format diffère à l'affichage et à la saisie
 
affichage -> %f pour les double et float (puisque le double va être converti)
lecture -> double %lf , float %f
 
vivelec > et me sort pas que c'est pas standard


Message édité par Taz le 02-06-2004 à 07:53:39
n°748402
Taz
bisounours-codeur
Posté le 02-06-2004 à 07:17:03  profilanswer
 

matafan a écrit :

Code :
  1. #include <sys/types.h>



pas portable donc. y a tout ce qu'il faut en C99 dans <stdint.h>

n°748427
cris56
Posté le 02-06-2004 à 08:20:13  profilanswer
 

Taz a écrit :


affichage -> %f pour les double et float (puisque le double va être converti)


 
et ya pas un truc qui s'appelle la promotion des parametre et qui converti les float en double ou c'est juste c pre ansi (k&r) ?

n°748430
Taz
bisounours-codeur
Posté le 02-06-2004 à 08:35:08  profilanswer
 

oups j'ai fait une erreur
 
-> (puisque le double^Wfloat va être converti)  
 
si. mais uniquement en entrée évidemment, ton float* tu peux le faire passer en double*, mais ça cassera. dans l'autre sens aussi.

mood
Publicité
Posté le 02-06-2004 à 08:35:08  profilanswer
 

n°748432
cris56
Posté le 02-06-2004 à 08:42:58  profilanswer
 

ok

n°748450
vivelec
Posté le 02-06-2004 à 09:01:30  profilanswer
 

Taz a écrit :

weed > en fait, c'est simple, c'est juste que le format diffère à l'affichage et à la saisie
 
affichage -> %f pour les double et float (puisque le double va être converti)
lecture -> double %lf , float %f
 
vivelec > et me sort pas que c'est pas standard


Tout dépend de tes standards ...
Sous UNIX et non sous linux, effectivement ce n'est pas "standard", du moins, le 'l' est ignoré.

n°749121
weed
Posté le 02-06-2004 à 16:55:03  profilanswer
 

oki je comprends mieux  
merci a vous tous ...
 
j'ai fais comme a dis matafan :

Code :
  1. printf("\nINT_MAX %d, UINT_MAX %u, LONG_MAX %ld",INT_MAX,UINT_MAX,LONG_MAX);


 
mais que vois je :

Code :
  1. INT_MAX 2147483647, UINT_MAX 4294967295, LONG_MAX 2147483647


int = long = (2^32)/2-1
est ce que je me suis trompé ?
sinon pour info :

Code :
  1. [weed@localhost include]$ cat limits.h | grep MAX
  2. #define MB_LEN_MAX      16
  3. #  define SCHAR_MAX     127
  4. #  define UCHAR_MAX     255
  5. #   define CHAR_MAX     UCHAR_MAX
  6. #   define CHAR_MAX     SCHAR_MAX
  7. #  define SHRT_MAX      32767
  8. #  define USHRT_MAX     65535
  9. #  define INT_MIN       (-INT_MAX - 1)
  10. #  define INT_MAX       2147483647
  11. #  define UINT_MAX      4294967295U
  12. #   define LONG_MAX     9223372036854775807L
  13. #   define LONG_MAX     2147483647L
  14. #  define LONG_MIN      (-LONG_MAX - 1L)
  15. #   define ULONG_MAX    18446744073709551615UL
  16. #   define ULONG_MAX    4294967295UL
  17. #   define LLONG_MAX    9223372036854775807LL
  18. #   define LLONG_MIN    (-LLONG_MAX - 1LL)
  19. #   define ULLONG_MAX   18446744073709551615ULL
  20.    LLONG_MAX, and ULLONG_MAX.  Instead only the values gcc defined for
  21. #  ifndef LLONG_MAX
  22. #   define LLONG_MAX    LONG_LONG_MAX
  23. #  ifndef ULLONG_MAX
  24. #   define ULLONG_MAX   ULONG_LONG_MAX


Message édité par weed le 02-06-2004 à 16:57:53
n°749472
matafan
Posté le 02-06-2004 à 20:29:46  profilanswer
 

Qu'est-ce qui ne te semble pas normal ?

n°749477
Taz
bisounours-codeur
Posté le 02-06-2004 à 20:32:19  profilanswer
 

vivelec a écrit :

Tout dépend de tes standards ...
Sous UNIX et non sous linux, effectivement ce n'est pas "standard", du moins, le 'l' est ignoré.

et allez, ça repart ... non mais non seulement de raconter des conneries tu dis des trucs dangereux. et tu te dis expert ? et ben mon Dieu !
 
%lf est tout a fait standard et ANSI
 
tu commences à nous saouler : ON EN A RIEN A FOUTRE SI T'ES TROP NUL POUR T'INSTALLER UN COMPILATEUR C

n°749480
Taz
bisounours-codeur
Posté le 02-06-2004 à 20:32:57  profilanswer
 

matafan a écrit :

Qu'est-ce qui ne te semble pas normal ?

rien, sur système 32 bits, il se trouve que sizeof(long) == sizeof(int)

n°749691
vivelec
Posté le 02-06-2004 à 23:03:16  profilanswer
 

Taz a écrit :

et allez, ça repart ... non mais non seulement de raconter des conneries tu dis des trucs dangereux. et tu te dis expert ? et ben mon Dieu !
 
%lf est tout a fait standard et ANSI
 
tu commences à nous saouler : ON EN A RIEN A FOUTRE SI T'ES TROP NUL POUR T'INSTALLER UN COMPILATEUR C


Qu'est-ce qu'elle a la petite merde ?
T'as tes règles ?
Prends du spafon cocotte et fais pas chier.
 

n°749693
vivelec
Posté le 02-06-2004 à 23:05:05  profilanswer
 

Taz a écrit :

rien, sur système 32 bits, il se trouve que sizeof(long) == sizeof(int)


Et je dirais que petite merde encore, sur 64 bits c'est la même chose.
Il n'y a plus de distinction entre le int et le long depuis que l'on a tous migré sur des archis en 32 bits.

n°749700
black_lord
Truth speaks from peacefulness
Posté le 02-06-2004 à 23:11:53  profilanswer
 

vivelec a écrit :

Qu'est-ce qu'elle a la petite merde ?
T'as tes règles ?
Prends du spafon cocotte et fais pas chier.


 
ce serait cool de rester poli.
 
[:shakalagoons]

n°749705
vivelec
Posté le 02-06-2004 à 23:16:17  profilanswer
 

black_lord a écrit :

ce serait cool de rester poli.
 
[:shakalagoons]


Ce n'est qu'un échange de bon procédés avec Taz.
Rien de bien méchant.

n°749738
weed
Posté le 02-06-2004 à 23:45:32  profilanswer
 

"Qu'est-ce qui ne te semble pas normal ? "
 
ce que retourne INT_MAX et LONG_MAX c'est qui me chagrine :
  INT_MAX 2147483647, UINT_MAX 4294967295, LONG_MAX 2147483647
 
long sert strictement a rien alors ???? si c'est tous les 2 : 2147483647
c'est bien 32 bits 2^32/2-1, je pensais que la taille ne voulait rien dire du fait que int ne soit pas compilé et le long compilé et que INT_MAX < LONG_MAX
 
mais il y a un long beaucoup plus long (ouou, le jeux de mots ;) )  

Citation :

#  define INT_MAX       2147483647  
 #   define LONG_MAX     9223372036854775807L # <====
 #   define LONG_MAX     2147483647L


Message édité par weed le 02-06-2004 à 23:50:50
n°749742
weed
Posté le 02-06-2004 à 23:47:46  profilanswer
 

et puis SVP, restez calme  
je ne sais pas qui a raison, mais que vous avez tous les 2, vivelec et taz, un tres tres bon niveau en linux/unix

n°749747
vivelec
Posté le 02-06-2004 à 23:51:34  profilanswer
 

weed a écrit :

et puis SVP, restez calme  
je ne sais pas qui a raison, mais que vous avez tous les 2, vivelec et taz, un tres tres bon niveau en linux/unix


Ce n'est pas une question d'avoir un bon niveau ou non, les métiers de l'informatique sont diverses et à chacun sa spécialité.
Cependant, la courtoisie et le respect sont des minimums, tant qu'ils sont réciproques.
Ce qui n'est pas toujours le cas.

n°749750
vivelec
Posté le 02-06-2004 à 23:53:56  profilanswer
 

weed a écrit :

"Qu'est-ce qui ne te semble pas normal ? "
 
ce que retourne INT_MAX et LONG_MAX c'est qui me chagrine :
  INT_MAX 2147483647, UINT_MAX 4294967295, LONG_MAX 2147483647
 
long sert strictement a rien alors ???? si c'est tous les 2 : 2147483647
c'est bien 32 bits 2^32/2-1, je pensais que la taille ne voulait rien dire du fait que int ne soit pas compilé et le long compilé et que INT_MAX < LONG_MAX
 
mais il y a un long beaucoup plus long (ouou, le jeux de mots ;) )  

Citation :

#  define INT_MAX       2147483647  
 #   define LONG_MAX     9223372036854775807L # <====
 #   define LONG_MAX     2147483647L




Cela ressemble à du linux.
Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire.

n°749761
weed
Posté le 02-06-2004 à 23:59:16  profilanswer
 

"Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire. "
 
dsl mais je comprends pas du tout  
ou vois tu de l'hexa et pourquoi me parle de binaire ?

n°749786
vivelec
Posté le 03-06-2004 à 00:12:26  profilanswer
 

weed a écrit :

"Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire. "
 
dsl mais je comprends pas du tout  
ou vois tu de l'hexa et pourquoi me parle de binaire ?


Tu remarqueras par exemple que 9223372036854775807L correspond à 7FFFFFFFFFFFFFFF qui correspond donc à la valeur max d'un 64 bits signé, soit -9223372036854775807 à +9223372036854775807.
Sur un 64 bits non signé, tu aurais droit à la plage 0 - 18446744073709551615.
Sur la majorité des plateformes, le bit de signe est en effet positionné sur le bit de poids fort.
Généralement, pour tout ce qui a trait à la manipulation de bits ou d'octets, on choisit l'octal ou l'héxa.

n°749794
Taz
bisounours-codeur
Posté le 03-06-2004 à 00:18:31  profilanswer
 

vivelec a écrit :

Et je dirais que petite merde encore, sur 64 bits c'est la même chose.
Il n'y a plus de distinction entre le int et le long depuis que l'on a tous migré sur des archis en 32 bits.

mais dis donc, tu me parais avoir une sacré expérience mon gars ... manqué sur beaucoup d'architecture 64bits, l'int fait 32bits et le le long fait nativement 64bits.

n°749798
Taz
bisounours-codeur
Posté le 03-06-2004 à 00:21:45  profilanswer
 

vivelec a écrit :

Cela ressemble à du linux.
Il est préférable d'adopter des conventions héxas pour tout ce qui a trait à du binaire.

ah ouais, moi aussi, je reconnais cette manière d'indenter.
 
weed > il est bizarre ton limits.h ...
 
cela dit, la norme impose que sizeof(int) <= sizeof(long) <= sizeof(long long)
 
sur X86 32bits, l'int et le long font 32bits, le long long 64bits, le contrat est respecté

n°749809
vivelec
Posté le 03-06-2004 à 00:28:50  profilanswer
 

Taz a écrit :

mais dis donc, tu me parais avoir une sacré expérience mon gars ... manqué sur beaucoup d'architecture 64bits, l'int fait 32bits et le le long fait nativement 64bits.


Es-tu vraiment sûr de ce que tu annonces ?
Ceci dit, je commençais à déspérer de ton absence.
Mais suis-je bête, on est jeudi, jour de congé pour les estudiantains !
Tes injures m'ont manquées à vrai dire.
Encore !

n°749823
Taz
bisounours-codeur
Posté le 03-06-2004 à 00:35:18  profilanswer
 

oui

n°749833
vivelec
Posté le 03-06-2004 à 00:38:51  profilanswer
 


En fait, et là, si tu as les preuves qui vont bien et pas sur linux, stp, les int et les longs sont codés sur 32 bits quelque soit la plateforme.
Ceci dit, j'aurais tendance à croire la même que toi.

n°749842
Taz
bisounours-codeur
Posté le 03-06-2004 à 00:41:24  profilanswer
 

vivelec a écrit :

En fait, et là, si tu as les preuves qui vont bien et pas sur linux, stp, les int et les longs sont codés sur 32 bits quelque soit la plateforme.
Ceci dit, j'aurais tendance à croire la même que toi.

K&R. il a juste une relation d'ordre imposé entre les tailles et des capacité minimales à fournir. on trouve donc des architectures où sizeof(int) == 4 et donc sizeof(long) == sizeof(void*) == 8

n°749878
weed
Posté le 03-06-2004 à 00:58:02  profilanswer
 

et bien en tout cas  
je suis vraimenent decu  
j'ai eu l'occasion de programmer sur du C borland sous win32sur une  architecture 32 bits, c'est peut etre pas du C trop standard mais le long etait plus long que ca ...  
 
bon allez bonne nuit

n°749916
vivelec
Posté le 03-06-2004 à 01:21:45  profilanswer
 

Taz a écrit :

K&R. il a juste une relation d'ordre imposé entre les tailles et des capacité minimales à fournir. on trouve donc des architectures où sizeof(int) == 4 et donc sizeof(long) == sizeof(void*) == 8


Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux.

n°749927
Taz
bisounours-codeur
Posté le 03-06-2004 à 01:28:48  profilanswer
 

vivelec a écrit :

Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux.

déjà je parle de sizeof(void*) et sur un système 64bits, encore heureux que sizeof(void*) == 8 :o

n°749931
SquiZZ
Posté le 03-06-2004 à 01:31:12  profilanswer
 

vivelec a écrit :

Vérifie par toi même, mais sizeof(void) n'est pas égal à 8 en dehors de linux.


 
tiens :
http://www.codeproject.com/cpp/FastDelegate.asp
 
matte un coup le chapitre "Implementations of Member Function Pointers"
la colonne "DataPtr"
 
 
[edit] oups, c'est du C++, mais bon la remaque reste valide


Message édité par SquiZZ le 03-06-2004 à 01:33:15
n°749938
Taz
bisounours-codeur
Posté le 03-06-2004 à 01:33:50  profilanswer
 

SquiZZ a écrit :

tiens :
http://www.codeproject.com/cpp/FastDelegate.asp
 
matte un coup le chapitre "Implementations of Member Function Pointers"
la colonne "DataPtr"
 
 
[edit] oups, c'est du C++, mais bon la remaque reste valide

ah ben non, et ho, les systèmes 64bits, faudrait pas non plus qu'ils puissent addresser 64bits :o

n°749949
SquiZZ
Posté le 03-06-2004 à 01:40:05  profilanswer
 

[:itm]

n°749952
vivelec
Posté le 03-06-2004 à 01:41:23  profilanswer
 

Taz a écrit :

ah ben non, et ho, les systèmes 64bits, faudrait pas non plus qu'ils puissent addresser 64bits :o


Donne-moi alors un vrai os 64 bitd, et je teste.
Rien ne vaut l'empirisme ..

n°749954
vivelec
Posté le 03-06-2004 à 01:42:05  profilanswer
 

vivelec a écrit :

Donne-moi alors un vrai os 64 bitd, et je teste.
Rien ne vaut l'empirisme ..


Oups, j'oubliais, tout sauf linux.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [c]Code format d'un double %f ou %lf ? Ou avoir + d'info sur long?

 

Sujets relatifs
générer un diagramme de classe a partir du code source[VBA] Ouvrir une base de données par le code ?
[c]pourquoi pow ((double)2,(double)3) renvoi 0 et non pas 8 ?sauver un tableau de short dans un format d'image
un même code sur toutes les pagesrecherche info sur les styles pour netscape 4
Programme pour faire du C++ (code + design)Je cherche le code de __FUNCTION__
Recherche info sur les lecteurs de code barre 
Plus de sujets relatifs à : [c]Code format d'un double %f ou %lf ? Ou avoir + d'info sur long?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR