Lib. pour calcul 64bits ?

15 sujets de 1 à 15 (sur un total de 31)

  • Counia

      #257602

      Bonjour,

      je tourne en rond sur un code C qui utilise des entiers et des décimaux en  64 bits.

      Ainsi que les fonctions trigonométriques qui les utilisent.

      Si quelqu’un à un exemple concret de ce qu’il faut inclure.

      Merci.

      Admin

      bigdan

        #257641

        Counia : sur Amiga classic, OS4 ou MorphOS ? La réponse m’intéresse aussi…

        Counia

          #257645

          Dans mon cas : classique et 680O0.

          Je suppose que l’origine des Lib. entraîne des faisabilités différentes.

           

          Y a déjà un début ici:

          http://obligement.free.fr/articles/c_calculs_flottants.php

          __sam__

            #257655

            Par décimaux 64 bits, tu veux parler de nombres à virgule fixe en fait?

            Les additions sont triviales à partir des additions entières 64bits. La multiplication est à peine plus compliqué. Pour les fonctions trigo, c’est en général les algorithmes “Cordic” qui sont utilisés lesquels se ramènent à des additions et décalages sur les données 64bits.

            Google est ton ami pour le détail des calculs “fixed-point”.

            Samuel.

            Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne 🙁
            A500 (+ 1Mo PPS), A1200 (Blizzard-IV/fpu/64Mo)
            A500 Vampire V2+ ^8^ 🙂
            (mais aussi TO8, TO8D, TO9. Groupe PULS.)

            Counia

              #257765

              Et bien je suis le premier surpris mais c’est géré pour les décimaux.

              Rien à faire de plus que d’utiliser la librairie “math”, vu qu’elle prend en charge le “double” et le “float” avec leurs fonctions respectives, par contre le “%Lf” du “printf” ne prend pas en compte la précision du “double” 🙁

              Quant aux entiers 64 bits j’ai rien trouvé.

              Mod

              Tcheko

                #257776

                Est ce que le compilateur C supporte la déclaration long long ?

                Ca serait déjà un bon début pour faire de l’arithmétique en entier sur 64 bits.

                Si ce n’est pas le cas, il faut passer par la face nord à la force du poignet et attaquer avec un peu d’assembleur.

                Il est existe des routines détaillés dans cet ouvrage.

                seg

                  #257843

                  La version classique de GCC, ainsi que SAS/C ne supportent pas le long long.

                  Pour ma part j’ai codé les algorithmes classics de division/multiplication/addition 64 bits en passant des arguments 64 bits découpés en poids fort et poids faible. On peut abstraire les poids des arguments en utilisant des pointeurs sur des données 64 bits. Question de commodité.

                  Pour une racine carrée, ce n’est pas plus compliqué que l’algo de division. Quant à la trigo, __sam__ doit pouvoir t’aider. On a déjà disserté là dessus il y a de nombreuses années.

                  Sinon, il y a une version classique de GCC sous cygwin qui doit théoriquement gérer les long long.

                  Counia

                    #257879

                    Dans mon cas avec DCC mais pas de 64bits, pour l’instant je pense que les “int64” vont passer en “double” ou perdre 3 digits.
                    J’ai aussi regardé pour refaire des fct (c’est un travail de recherche sur ces algo. très intéressent) mais à part l’élévation à la puissance, si je peux m’en passer.

                    Peut-être que dans le code 68k de la Vampire on pourrait demander des registres 64bits avec MulX et DivX en dur 😉

                    Counia

                      #258129

                      Finalement j’ai besoin des fonctions “int64”, déjà pour manipuler et disséquer les “doubles”.
                      Je suis en train de tester des algo. vites fait et arbitrairement j’ai choisi pour c=f(a,b) :
                      (E) a=A0 et b=A1 ; adr des deux “int64” à calculer.
                      (S) c=D0+D1 ; valeur 64bits du résultat.
                      (de mes souvenirs poussiéreux D0,D1,A0,A1 sont écrasages sur Amiga).
                      Mais pour faire “respectueux” je me demandais ce qu’il est “propre” de faire sur Amiga pour le passage des param. ; (E) sur pile? ou reg.adresse? et (S) reg.donnée? ou reg.adr? ou pile?
                      Au final c’est pour utiliser ces fct. Asm dans mon code C.

                      DenisPaul

                        #258130

                        @tcheko
                        J’utilise StormC 4 sur classic et il supporte bien (et compile) la déclaration en long long, contrairement à Hisoft C par exemple.

                        Admin

                        bigdan

                          #258131

                          A propose de calcul sur des grands nombres, quelqu’un a tenté d’utilise la bignum.library des Ringards avec le Sas/C ou Vbcc ?

                          http://aminet.net/package/util/libs/BigNum

                          Counia

                            #258914

                            J’ai enfin fini les opérations de base sur les entiers 64bits -> 64bits sans perte par dépassement (avec extension le cas échéant) .

                            Addition et soustraction sont triviales  avec le bit de retenue X.

                            Par contre, le coup des opérations de multiplication et de division me fait un peut peur pour les algo. des fonctions trigo à venir.

                            Par exemple ma division tourne entre 4564(cas le meilleur) et 11.242 cycles  (cas le pire) , algo de décalage et de soustraction (reste-diviseur) et 1600 à 1900 cycles en 32 bits.

                            La multiplication ~3150 cycles (elle s’appuie sur 4 multiplications 32×32->64 qui elle s’appuie sur 4 multiplications 16×16->32).

                             

                            Pour utilisation par du code C, quelqu’un pourrait m’expliquer les bonnes pratiques pour passage des param. ?  ; ou un lien sur un exemple ?

                            Counia

                              #258915

                              @bigdan
                              Je suis pas aller vers ces “BigNum”, vu qu’ils utilisent du code 68020.

                              Mod

                              Tcheko

                                #258926

                                @counia pour la division, c’est pas trop étonnant comme résultat.

                                La page wikipedia donne différentes approches pour réaliser celle ci qui je pense devrais être (je l’espère) plus rapide.

                                https://en.wikipedia.org/wiki/Division_algorithm

                                Pour les histoires de registres, c’est simple: tu dois préserver les registres que tu trash pendant ton code asm et les restaurer à la sortie minus les registres considérés comme trash.

                                Les seuls registres non préservés sont bien D0,D1,A0,A1.

                                De la documentation officielle C= :

                                System Functions Do Not Preserve D0, D1, A0 and A1.
                                —————————————————
                                If you need to preserve D0, D1, A0, or A1 between calls to system
                                functions, you will have to save and restore these values yourself.
                                Amiga system functions use these registers as scratch registers and
                                may write over the values your program left in these registers. The
                                system functions preserve the values of all other registers. The
                                result of a system function, if any, is returned in D0.

                                En tout cas, bon courage. 🙂

                                ++

                                cclecle

                                  #258932

                                  Quelques posts de retards, mais concernant le printf, il me semble que dans la norme (C99) fait que printf ne supporte que les double et cast donc les float en double.

                                  Après ça dépend de l’implémentation qui a été faite sur amiga… !

                                  donc  %f  prend en charge les double et les float de façon transparente ! (pas besoin de %lf)

                                  Source: http://stackoverflow.com/questions/4264127/correct-format-specifier-for-double-in-printf

                                  Valable au moins sur les environnement qui respectent C99… JE ne sais pas si c’est le cas ici !

                                  A600 + 604n + RTC + Vampire V2 600, Coffin R54 / wb3.1.4.1
                                  A1200 + Vampire V2 1200, wb3.1.4.1

                                15 sujets de 1 à 15 (sur un total de 31)

                                • Vous devez être connecté pour répondre à ce sujet.

                                Forums AmigaOS, MorphOS et AROS Développement Lib. pour calcul 64bits ?

                                Amiga Impact