Ceil

CoreCore Membre
03:29 modifié dans API AppKit #1
Bonjour,

Toujours dans la série NewBie voici une nouvelle question :

Quand  je fais :

<br />float f = 1.2 ;<br />int i = ceil(f) ;<br />


J'obtiens 2, par contre quand je fais :

<br />float f = 30/25 ;<br />int i = ceil(f) ;<br />


J'obtiens 1, je suis persuadé que je passe a coté d'une notion fondamentale, alors si quelqu'un pouvez combler cette lacune !

D'avance Merci

Réponses

  • ChachaChacha Membre
    03:29 modifié #2
    Bonjour,

    dans 1109686880:

    <br />float f = 30/25 ;<br />
    



    Et oui, c'est bien une notion fondamentale qui fait défaut ! En C, une division entière donne un résultat entier; Ici, f est initialisé à  30/25 = 1
    Si tu voulais calculer un flottant, il fallait mettre
    f = 30.0/25.0

    Car 30 est un entier, alors que 30.0 est un double.

    T'es pas le premier, et tu seras pas le dernier !

    Détail pour être exhaustif : 30.0 est un double, 30.0f est un float. C'est bon à  savoir quand on s'intéresse aux erreurs d'arrondis.

    +
    Chacha
  • cbrandtcbrandt Membre
    mars 2005 modifié #3
    quand tu divise 30 par 25, tu divises un entier par un autre et donc tu obtiens un entier - que tu le stockes dans un float n'a pas d'importance: f contiendra 1.

    si tu divises 30 par 25.0 c'est différent: là  tu divises par un float donc le résultat sera un float aussi et f contiendra 1.xxxxxxx.

    EDIT
    grillé....
    quoique: t'es sûr Chacha ? c'est pas plutôt ce qui est après le '/' qui doit être un float ? ce qui est avant n'a pas d'importance me semble-t-il ? mon 'richie et kernighan' est égaré depuis longtemps...
  • CoreCore Membre
    03:29 modifié #4
    Merci à  vous deux !

    MIeux vaut avoir l'air ridicule 5 mins que rester idiot toute sa vie !  :P
  • Eddy58Eddy58 Membre
    03:29 modifié #5
    Core, comme je l'ai déjà  dit autre part sur le forum, il n'y a que ceux qui ne font rien qui ne font pas de conneries...:)
    C'est en faisant des conneries et en posant des questions qu'on apprend le mieux...:P
  • ChachaChacha Membre
    03:29 modifié #6
    dans 1109687374:

    quoique: t'es sûr Chacha ? c'est pas plutôt ce qui est après le '/' qui doit être un float ? ce qui est avant n'a pas d'importance me semble-t-il ?


    En fait, il suffit qu'une des deux opérandes soit un float pour convertir l'intégralité de l'opération en float.
    Il suffit de se dire que quand les types ne coà¯ncident pas, le compilateur privilégie automatiquement celui qui minimisera l'erreur.
    30/25.0f => 30 est converti en float, le résultat est un float
    30/25.0 => 30 est converti en double, le résultat est un double
    30.0f/25.0 => 30.0f est converti en double, le résultat est un double
    etc.
  • GreensourceGreensource Membre
    03:29 modifié #7
    Je déterre ce sujet car j'ai une petite question à  propos. Je cherche à  faire un arrondi et j'ai vu que ceil() pouvais m'aider. Sauf qu'il arrondi pas, ou alors toujours à  l'entier supérieur. Je cherche donc un pendant qui fasse bien l'arrondi.
    Une idée? Merci
  • laurrislaurris Membre
    03:29 modifié #8
    Il y a floor() qui arrondit à  l'entier inférieur comme son nom l'indique. Pour un arrondi à  l'entier le plus proche il y a round ou roundf et d'autres fonctions encore que l'on trouve facilement en recherchant "round" dans la doc Xcode.
  • GreensourceGreensource Membre
    03:29 modifié #9
    Ah très bien, merci. Je ne savais pas qu'on disais round pour arrondi en Anglais. Merci!
Connectez-vous ou Inscrivez-vous pour répondre.