IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

logarithme & uint64_t


Sujet :

C

  1. #1
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut logarithme & uint64_t
    Bonjour,

    Je souhaite avoir une fonction log() qui puisse calculer le logarithme d'un uin64_t.
    Est-ce possible? Math.h n'a pas l'air à supporter cela donc...
    Quelqu'un a une solution?

    Une fonction déclarée du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double log(uint64_t n) { ... };
    Merci!

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonsoir,

    un cast ? double x=log( (double) n );

  3. #3
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 593
    Par défaut
    Salut,

    Attention en utilisant les double tu ne peux plus représenter les nombre entiers au delà de 2^53.

    Tu ne pourras donc pas calculer le log de la plage [(2^53)+1 : (2^64)-1]

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par mith06 Voir le message
    Salut,

    Attention en utilisant les double tu ne peux plus représenter les nombre entiers au delà de 2^53.

    Tu ne pourras donc pas calculer le log de la plage [(2^53)+1 : (2^64)-1]
    Bonjour,
    je me permets un petite rectification : «en utilisant les double tu ne peux plus représenter exactement les nombre entiers au delà de 2^53.»
    Cela ne signifie pas qu'on ne peut plus calculer le log avec une précision suffisante (celles des double) en utilisant un simple cast.
    On peut soit calculer l'erreur commise, soit se convaincre qu'un cast est largement suffisant avec un petit programme de test comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <stdio.h>
    #include <math.h>
    #include <stdint.h>
    #include <inttypes.h>
     
    int main()                                                                          
    {                                                                                   
      uint64_t max_u64=UINT64_MAX;                                                      
      double max_d=18446744073709551615.0;                                              
     
      printf("avec cast  : log2(%"PRIu64")=%g\n", max_u64, log( (double) max_u64 ) / lo\
    g(2) );                                                                             
      printf("sans cast  : log2(%g)=%g\n", max_d, log(max_d) / log(2) );                
      printf("différence : %g\n", (log(max_d)-log((double)max_u64)));                   
      return 0;                                                                         
    }
    qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > ./log_test 
    avec cast  : log2(18446744073709551615)=64
    sans cast  : log2(1.84467e+19)=64
    différence : 0

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le cast ne peut rien apporter si le code compile sans lui : Dans log(x), l'argument de log() doit être un double. Si le type de x admet un cast implicite en double, il sera effectué et ce sera équivalent à log((double)x). Sinon, on aura une erreur de compilation.

    Pas étonnant donc que les résultats du test soient identiques

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo