PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 128bit datentyp in c



stormbringer
30.10.2002, 18:05
hi

ich brauch in meinem c programm einen 128bit datentyp. ich verwende im moment vc++ 6.0, möchte meinen code aber portabel halten. wie bau ich mir denn sowas?

stormbringer

Jailbird
30.10.2002, 18:47
ist nur so eine idee und hab auch keine ahnung, ob du das so einfach hinkriegst...

also...win32 unterstützt standartmässig ja keine 128-datentypen (sonst gäbe es ja welche :D )

aber 64bit wird unterstützt (int64)
du könntest dir jetzt also einen typen machen, der aus 2 int64 besteht und den einen für den High- und den anderen für den Low-Teil nehmen

Zahl.High : int64 (zusatz für int128 )
Zahl.Low : int64 (wie standart int64)

allerdings darfst du so alle rechenoperationen etc. auch neu basteln. eine andere variante entdecke ich momentan grad nicht

viel spass beim umsetzen :D

fabio
30.10.2002, 19:02
Der 64-Bit-Integer heisst in Visual C++ __int64. Einen eingebauten 128-Bit-Integer gibts wie gesagt nicht. Schon gar nicht einen portablen. Du müsstest, falls du dies zum numerischen Berechnen brauchst, eine Bibliothek für Ganzzahl-Arithmetik benutzen. Zum Beispiel die C++-Bibliothek NTL (http://www.shoup.net/ntl/), kenn sie aber nicht.

stormbringer
30.10.2002, 19:07
jaja, sowas hab ich mir auch gedacht. ist etwa das gleiche verfahren wie in assembler zwei 16bit register zu nem 32 oder halt heute zwei 32bit zu einem 64bit register zu baseltn. rechnen tut man dann mit den bits im high und low bereich. nur gerade da hab ich im moment einen knoten wie ich das in c machern muss.

fabio
30.10.2002, 19:12
Das Ganze ist komplizierter als es zunächst erscheint, wenn man nicht nur Addition und Multiplikation braucht. Ist wahrscheinlich auch wieder ein Thema in NSR, wo ein paar einzelne Algorithmen vorgestellt werden.

stormbringer
30.10.2002, 19:29
so kompliziert kann es nicht sein. eigentlich sind es nur bitoperationen, bei denen man die überläufe richtig abfangen und übertragen muss. dafür gibt es das of (das overflow flag). nur, wie greiff ich in c darauf zu?

fabio
30.10.2002, 19:33
wie greiff ich in c darauf zu?

Mit Inline-Assembler. ;)

Welche Operationen brauchst du denn?

Apophis
30.10.2002, 19:44
tja storm :) du stellst dir das immernoch etwas zu einfach vor :) bei der Addition reicht die abfrage vom überlaufbit. bei der multiplikation leider schon nicht mehr... warum? tja weil das nicht nur ein bit überlaufen kann, da läuft dann meistens ein ganz schöner brocken über... beispiel gefälltig

typ byte (c heisst der glaub unsigned char oder so)$

255 * 255 [mod 256] = 1
überlaufbit ist gesetzt... und jetzt? wie weiter?
ins Highregister muss nämlich jetzt noch der wert 254 rein aber denn musst du ja berechnen.

ahja viel spass :) ich wollte auch schon mal grössere typen haben.

Da fällt mir nur grad gannimo ein. Benutz Java da gibts Integers beliebiger länge :D

robZ
30.10.2002, 21:18
hmm...müssen die berechnungen schnell sein? sonst könnte man ja mit strings rechnen...probleme mit überlauf hätte man dann nimma. weiss aba ned wies du in c implementieren musst. hab kA... :(

stormbringer
30.10.2002, 21:45
@apo

das mit dem multiplikativen überlauf ist mir schon klar. den muss man natürlich vor der multiplikation abschätzen und behandeln.

@robZ
das mit den strings hab ich mir auch schon überlegt. das ginge auf zwei arten.

1. nimm ein array[64] of int (i luv oberon). dies ist aber speichertechnisch gesehen unsinn.

2. nimm ein array, in dem jedes element ein integer ist, somit bracuhst du 4 elemente und musst auf diese bitweise zugreifen. das problem ist das gleiche wie bei ner struct.

das problem mit der geschwindigkeit ist auch noch da, da das progi über files >2gb scannt.

ich denke ich werd mal versuchen mitels inline asm nen neuen datentyp zu generieren.

kennt wer docus zum thema?

Apophis
30.10.2002, 21:56
nein leider ned aber wenn du was findest bin ich SEHR daran interessiert.

Das mit dem String geht :) hab ich in Delphi mal programmiert gehabt, aber da war auch das Multplizieren das grosse Problem. Habs dann aufgegeben und mit 64bit gerechnet ;)

robZ
30.10.2002, 22:13
@stormbringer: jo das stimmt...meinte aber mit chars rechnen. evt könnte man ja auch im 256-system rechnen (falls du angst um den speicherplatz hast)...oda so...habs mir ned genau überlegt.

auf jeden hf mit assembler :)) wenns funzt wäre ich auch interessiert... :D

ps: wir könnten ja morgen am 1.sem-fest _leicht angeheitert_ über das thema labern :D wäre sicha cool...gn8

stormbringer
30.10.2002, 22:25
ok, dann reden wir morgen unter drogeneinfluss. werd mit ganimmo da sein. da ich aber die wenigsten hier kenne, müsst ihr halt mich anquatschen (da mich ja die meisten scheinbar kennen :-) )

ich mach das mit dem datentypen übrigens nicht freiwillig (obwohls dennoch spass macht) 64bit reichen nun mal nicht und mein chef will das progi am liebsten gestern.

fabio
31.10.2002, 08:47
Solange du keinen 128-Bit-Prozessor hast, wirst du mit Assembler auf die gleichen (unlösbaren) Probleme stossen. Deshalb nochmals zurück zu C:

Für die Addition, Subtraktion und Multiplikation gibt es recht einfache Algorithmen, um mit Integers beliebiger Länge zu rechnen. Schau mal in den Unterlagen (http://www.inf.ethz.ch/personal/nagel/vl/nsr/ganzzahl/) der NSR-Vorlesung von Prof. Nagel.

Dass man diese problemlos für auf 128-Bit beschränkte Zahlen nach C übertragen kann, zeigt mein kleines Progrämmchen (http://www.fabio.ch/studium/sysprog/128bit.c), das die Fakultät von 33 berechnet. Allerdings ohne irgendwelche Optimierungen. Die BigInts werden als Array von 4 long ints dargestellt.

till
02.11.2002, 20:13
wir mussten doch vor einem Jahr in NSR mal so ein Programm schreiben, das beileibig grosse Zahlen verarbeiten kann...

Apophis
02.11.2002, 20:37
wie dreh ich im Acrobat Reader das die Seite querformat daher kommen oder muss ich tatsächlich den Bildschirm drehen ;)

fabio
02.11.2002, 21:18
Es gibt eine "Werkzeugleiste", die "Anzeigen" heisst und darin das Symbol "Anzeige im UZS drehen". Ansonsten ist Bildschirm- oder Kopfdrehen sicher auch sehr effektiv. ;)

Apophis
02.11.2002, 21:38
ja du findest das vielleicht witzig :)

aber schau dir das doch an... da gibts diesen Befehl eben genau ned... wenns so offensichtlich wäre dann hätt ichs womöglich auch gefunden :)

fabio
02.11.2002, 21:40
Und wie sieht das Menü "Fenster" aus? Das ist doch Version 5.x oder so?

fabio
02.11.2002, 21:45
Ansonsten ist dieser Teil der Folien auch hier (und zwar gedreht! :) ):
http://www.fabio.ch/studium/nsr/ganzzahl.pdf