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 :

[C#] Comment representer un entier de 128bits ?


Sujet :

C#

  1. #1
    Membre du Club Avatar de AdriM
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 66
    Points
    66
    Par défaut [C#] Comment representer un entier de 128bits ?
    Salut,

    Je dois réalise un convertisseur de type, dont un entier de 128 bit. Les types primaires definis vont jusqu'au 64 bits (long)... après, je sais plus trop.

    Decimal semble représenter un entier de 96 bits mais je suis pas sur...
    decimal un 128 data type.


    Là j'hesite entre representer cet entier comme decimal, ou une structure de 4 int-32...

    J'y arrives pas... un petit conseil serait pas de trop! Merci

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Salut,

    Tu peux utiliser un Unsigned long qui sera encore plus grand.

    Au pire, tu peux utiliser une librairie externe ? Par exemple BigInteger.

    A+
    K

  3. #3
    Membre du Club Avatar de AdriM
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    pas vraiment...

    Un Int128 doit representer 2^127... trop court pour une structure de 2 Int 64 aussi...

    Commence a desespérer

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Et en faisant une structure Int128 à toi qui contient en interne deux long (ou un long et un ulong pour la 2è moitié), en reproduisant toutes les méthodes et opérateurs habituels des autres types à la short/int/long/... ?

    Ça fait un peu de maths pour reproduire les opérations, mais à part ça, ça devrait être fait pour :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Il y a peut être une piste en implementant ta propre dll managé C++ car il semble y avoir une solution de ce côté
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vcrefwillametteintegerintrinsics.asp
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  6. #6
    Membre du Club Avatar de AdriM
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    >>Maniak :
    Même comme ça, ce serait trop court. un Int128 a une valeur maximale de 1.7 e 10^38.

    Alors je desespère, je sais pas quoi faire, et le boulot est pour demain

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par AdriM
    >>Maniak :
    Même comme ça, ce serait trop court. un Int128 a une valeur maximale de 1.7 e 10^38.
    Un Int128 tient sur 128 bits, dont 1 signé.
    Un long tient sur 64 bits, dont 1 signé.
    Un ulong tient sur 64 bits.
    Un long + un ulong tiennent sur 128 bits, dont 1 signé.

    Par quel mystère mathématique est-ce que ce ne serait pas suffisant ? :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  8. #8
    Membre du Club Avatar de AdriM
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    un int128 devrait avoir pour valeur maximale 2^127 soit plus ou moins 2.10e38 (un nombre 1 nombres à 38 chiffres).

    Un Int64 (ou long) a pour valeur max de 9.0e18, donc deux Int64 au max permettrait de representer un nomre a 36 chiffres...

    si j'ai tout faux, c'est normal

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Tu comptes en signé. Faut pas compter en signé :)

    128 bits -> 2^128
    64 bits -> 2^64
    2*64 bits -> 2^128 (quelque part, ça semble logique :)

    Pour le maximum signé, tu divises par deux, ça ok. Mais tu le fais après :)

    2^64 * 2^64 = 2^128
    par contre, 2^63 * 2^63 = 2^126 < 2^127 :) tu bouffes 2 bits de signe au lieu d'un :)

    Pour ça que je disais de prendre un long pour la première partie (signé, 2^63 max en positif) et un ulong (non signé, 2^64 max)
    Et là, 2^63 * 2^64 = 2^127. on retombe sur ce qu'il faut pour un Int128.


    (les maths c'est quand même plus simple quand on se contente de penser en 0 et en 1. quelle idée ils ont eu d'inventer des nombres plus gros)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Je n'ai pas testé la classe BigInteger dont j'ai donné le lien plus haut, mais ne répond-elle pas à ton besoin ?
    K

  11. #11
    Membre du Club Avatar de AdriM
    Inscrit en
    Mars 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Je n'ai pas testé la classe BigInteger dont j'ai donné le lien plus haut, mais ne répond-elle pas à ton besoin ?
    Je voulais juste éviter d'utiliser une classe que je n'ai pas dévellopée.

    J'ai trouvé une solution certainement pas très bonne, mais qui devrait servir pour l'instant.

    Une structure de 2 ulong et un int... l'explication mathématique de maniak est bonne, mais je reverrais ça plus tard.

    MErci a vous tous

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

Discussions similaires

  1. comment representer un fichier [xml] graphiquement ?
    Par djwes2001 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 30/03/2006, 15h37
  2. Comment representer un arbre (binaire ou non) en python?
    Par MadCat34 dans le forum Général Python
    Réponses: 2
    Dernier message: 22/03/2006, 16h25
  3. [C#] Comment convertir un entier en couleur ?
    Par L`artiste dans le forum C#
    Réponses: 3
    Dernier message: 08/01/2006, 20h52
  4. Comment arrondir à l'entier supérieur ?
    Par kuranes dans le forum Access
    Réponses: 3
    Dernier message: 29/11/2005, 17h42

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