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 :

Division de grands entiers par un flottant


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Division de grands entiers par un flottant
    Bonjour,

    Dans un programme je simule actuellement un entier composé de plusieurs entiers non signés de 64 bits.

    Je souhaiterai calculer une valeur arrondit à l'unité prêt de la division d'un tel entier par un flottant.

    Cependant je ne sais comment faire, j'ai déjà testé une manière de faire qui fonctionnait dans la théorie, mais dans la pratique les doubles et longs doubles ne semblent pas du tout apprécier... si vous le souhaitez je vous la détaille...

    C'est pourquoi je viens faire appel à vous, car après quelques recherches je n'ai pas trouvé de travaux semblables. ( par exemple division d'un uint128_t par un flotant... ), et peut-être avez vous connaissance d'algorithmes ou de méthodes prévues pour.

    Merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    J'avais fait une chose similaire mais en divisant par un unsigned long long int[2]
    Diviseur : X
    Dividende : Y
    Pointeur unsigned long int x
    Pointeur unsigned long long int y

    En gros :
    - Je fait : x = K + (unsigned long int *)&X; Afin d'obtenir le unsigned long int de X de poids le plus fort possible.
    y = K' + (unsigned long int *)&Y; Idem
    - Tant que X < Y :

    - tant que (*x) < (*y)
    - je fait : Y -= (*y/*x)*X
    - fin tant que;

    - y = (unsigned long long int *)(1 - (unsigned long int *)y) //on décale y
    - fin tant que
    C'est une solution que j'avais fait moi-même donc je doute que ce soit la meilleur solution.
    Sinon, il me semble qu'il existe des bibliothèques mathématiques qui sont capable de tout faire elles-même.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci pour votre réponse,

    Cependant je ne vois pas trop le rapport avec mon problème, je ne comprends pas trop comment fonctionne votre algorithme.
    ( combien valent K et K'? quand est ce que (x) < (y) est satisfait vu que x et y ne changent jamais ? "je fait : Y - (y/x)*X" vous placez le résultat où? )

    Mais il divise des entiers par des entiers, mon problème traite d'un grand entier non signé divisé par un flottant.

  4. #4
    Membre confirmé Avatar de saymoneu
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2010
    Messages : 248
    Points : 505
    Points
    505
    Par défaut
    Et si tu fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float resultat = (tonInt * 1.0) / tonFloat;
    Ca ne marche pas ça? Me semble que j'ai deja fait un truc comme ça

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    J'ai corrigé quelques petites erreurs et il doit sûrement en avoir encore.

    K et K' sont à choisir de sorte d'avoir le poids le plus fort possible qui sera pointé pour x et y.

    J'aurais peut être dû commencer par cela :

    Un flottant est un nombre décimal, il vaut donc :
    X/D où X est un entier et D une puissance de 10.

    On peut aussi décomposer Y pour faciliter la division :

    Soit X = A*B et Y = C*D,
    Y/X = (C*D)/(A*B) = C/(A*B) * D

    On peut aussi avoir : Y = G + C*D + E*D*D + F*D*D*D
    D'où Y/X = G/(A*B) + D*(C/(A*B) + D*(E/(A*B) + D*(F/(A*B))))

    Les divisions sont déjà beaucoup plus simples.

    @saymoneu : l'entier que le PO manipule sont beaucoup trop grand pour que le processeur sache faire la division en une seule instruction

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par saymoneu Voir le message
    Et si tu fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float resultat = (tonInt * 1.0) / tonFloat;
    Ca ne marche pas ça? Me semble que j'ai deja fait un truc comme ça
    Citation Envoyé par ijatsu;
    Dans un programme je simule actuellement un entier composé de plusieurs entiers non signés de 64 bits.
    Je veux bien mais j'ai pas un entier, mais un "grand" entier, composé de plusieurs entiers de 64 bits.
    Et la méthode que j'ai appliqué jusqu'ici a été de diviser seuls chaque entiers, et de répercuter les valeurs décimales de ceux de poids forts vers ceux de poids faibles, mais ça n'a pas marché au niveau des doubles car ils sont trop petits... :/

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Neckara Voir le message
    J'ai corrigé quelques petites erreurs et il doit sûrement en avoir encore.

    K et K' sont à choisir de sorte d'avoir le poids le plus fort possible qui sera pointé pour x et y.

    J'aurais peut être dû commencer par cela :

    Un flottant est un nombre décimal, il vaut donc :
    X/D où X est un entier et D une puissance de 10.

    On peut aussi décomposer Y pour faciliter la division :

    Soit X = A*B et Y = C*D,
    Y/X = (C*D)/(A*B) = C/(A*B) * D

    On peut aussi avoir : Y = G + C*D + E*D*D + F*D*D*D
    D'où Y/X = G/(A*B) + D*(C/(A*B) + D*(E/(A*B) + D*(F/(A*B))))

    Les divisions sont déjà beaucoup plus simples.

    @saymoneu : l'entier que le PO manipule sont beaucoup trop grand pour que le processeur sache faire la division en une seule instruction
    Si je comprends bien, vous me proposez de faire une division binaire normale en considérant mon flottant comme un entier, mais tôt ou tard il me faudra nécessaire diviser mon résultat final par la puissance de 10 que j'ai ignoré jusque là, et je retomberai à nouveau sur mon problème actuel.

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Avec Y = 3,54645 il est possible de faire : Y = 3 54645 * 10^-5
    Mais en informatique on préfèrera les puissances de 2
    Donc Y = R * 10^-B

    En faisant un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int B = 0;
    float Fbis = F;
    int R = (int)Fbis;
    while(R != Fbis)
    {
            Fbis *= 2;
            R = (int)Fbis;
            B++;
    }
    ?

    Et à la fin tu n'auras plus qu'un décalage de bit à faire.


    Après, je suis sûr qu'il y a des bibliothèques qui savent déjà faire cela.

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Avec Y = 3,54645 il est possible de faire : Y = 3 54645 * 10^-5
    Mais en informatique on préfèrera les puissances de 2
    Donc Y = R * 10^-B

    En faisant un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int B = 0;
    float Fbis = F;
    int R = (int)Fbis;
    while(R != Fbis)
    {
            Fbis *= 2;
            R = (int)Fbis;
            B++;
    }
    ?

    Et à la fin tu n'auras plus qu'un décalage de bit à faire.


    Après, je suis sûr qu'il y a des bibliothèques qui savent déjà faire cela.
    Oui c'est la solution idéale et j'y avais déjà pensé mais le problème est que mon float n'arrive jamais à une valeur correcte en le multipliant par 2.

    Je pense que si je ne trouve rien de concluant je vais me contenter d'une valeur rapprochée avec cette méthode. ^^

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    http://fr.wikipedia.org/wiki/IEEE_754

    En multipliant par 2, on est obligé d'obtenir un entier au bout d'un moment.

    Il faudrait voir s'il existe pas une fonction standard pour récupérer directement la mantisse, l'exposant et le signe séparément et directement, ceci sera beaucoup plus rapide.

  11. #11
    Futur Membre du Club
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Oui c'est vrai! j'avais complètement oublié que la mantisse donnait exactement ce qu'il fallait pour avoir un entier à partir d'un float , j'étais resté sur le fait que mon nombre d'or était par dans Q.

    Il suffit pour un float de multiplier simplement par 2^23
    de faire la division binaire
    puis de diviser mon gros entier par 2^23 et donc 23 décalages :]

    Je pense qu'il y a de quoi faire maintenant. merci bien pour votre patience et votre aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/08/2014, 17h56
  2. Division grand entier
    Par cliclik97160 dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 17/06/2014, 19h39
  3. Division sur de Grands entiers
    Par mawguai dans le forum Mathématiques
    Réponses: 4
    Dernier message: 06/06/2008, 21h08
  4. Diviser un entier de grande longueur par un autre entier
    Par DelphiManiac dans le forum Contribuez
    Réponses: 5
    Dernier message: 03/12/2006, 17h14
  5. Obtenir le plus grand entier !
    Par Gogoye dans le forum C
    Réponses: 3
    Dernier message: 09/12/2003, 09h40

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