Seite 1 von 2

Was ist das für eine Zahlendarstellung?

Verfasst: Sa Jan 07, 2012 8:18 pm
von Bebu
Ich habe in Dedupe einen fiesen Bug entdeckt. In der Datenbank werden die Hashwerte teilweise in dieser Form gespeichert:
1.11867966967434e+19
Ist das Expondentialdarstellung? Diese Art von Mathematik hatte ich nie. Aber ich brauche eine Möglichkeit das ganze in Normaldarstellung in ein unsigned long long zu speichern. Davon hängt es ab, ob die Duplikate auch gefunden werden. Bisher habe ich einfach die Sql Strings per Stringstream zurückgelesen, aber das klappt nicht, wenn die Zahl so dargestellt wird. Jemand eine Idee?

Re: Was ist das für eine Zahlendarstellung?

Verfasst: Sa Jan 07, 2012 8:24 pm
von cloidnerux
Ist das Expondentialdarstellung?
Schon. Aber das zeigt ein Problem mit dem Datenbanktyp zu sein. Welchen typ hat das entsprechende Feld?
Vlt den typ auf string setzten und halt die uint64 hin und her konvertieren.

Re: Was ist das für eine Zahlendarstellung?

Verfasst: Sa Jan 07, 2012 8:30 pm
von Bebu
*stirnklatsch* Du bist ein Genie :D Aber da hätte ich auch selber drauf kommen können...

Re: Was ist das für eine Zahlendarstellung?

Verfasst: Sa Jan 07, 2012 8:40 pm
von Bebu
Mhh euphorisch ist wieder verflogen. Jetzt wird alles als String gespeichert, der Fehler ist immer noch gleich :( Das heißt weitersuchen.

Edit: Jetzt hab ich es. Wenn man alle Werte auch konsequent als String in die Datenbank speichert, dann klappt es. Danke für die Hilfe, war der Wink in die richtige Richtung.

Re: Was ist das für eine Zahlendarstellung?

Verfasst: So Jan 08, 2012 12:19 pm
von Xin
Was ist "Normaldarstellung"?

Und wie erzeugst Du aus dem uint64 eine Exponentialdarstellung?
Ein uint64 sollte natürlich auch als uint64 gespeichert werden!

Re: Was ist das für eine Zahlendarstellung?

Verfasst: So Jan 08, 2012 6:58 pm
von Bebu
Normaldarstellung ist für mich die am weitesten verbreitete Art Zahlen darzustellen: Eine Zahl im Zehnerzahlensystem, so lesbar, wie es jeder Grundschüler in der Schule lernt. Wie das jetzt exakt heißt weiß ich nicht. Ich bin ja verstanden worden :P

Ich erzeuge die Expontialdarstellung gar nicht, das macht Sqlite intern. Zahl wird als SQL Statement und damit als String in ein 64 bit Zahlenfeld der Datenbank geschrieben. Ab einer bestimmten Anzahl Stellen wechselt Sqlite auf diese Darstellung. Um genau feststellen zu können welcher Datentyp in der Datenbank lauert, ist Sqlite zu beschränkt, ich kann nur abfragen ob das ein Int, Double, String oder Binär ist. Also habe ich alle Datenfelder auf String umgestellt, lese über einen Stringstream das SQL Statement zusammen und speichere alles als String. Beim Auslesen weiß ich welche Felder in welchen Zieltyp konvertiert müssen, kann das wieder per Stringstream erledigen und habe sicher die richtigen Daten in der richtigen Darstellung am richtigen Ort. Mit dieser Lösung bin ich sehr zufrieden, sie ist einfach und sie funktioniert

Re: Was ist das für eine Zahlendarstellung?

Verfasst: So Jan 08, 2012 9:06 pm
von Xin
Bebu hat geschrieben:Normaldarstellung ist für mich die am weitesten verbreitete Art Zahlen darzustellen: Eine Zahl im Zehnerzahlensystem, so lesbar, wie es jeder Grundschüler in der Schule lernt. Wie das jetzt exakt heißt weiß ich nicht. Ich bin ja verstanden worden :P
Zehnerzahlensystem => Dezimaldarstellung. :)
Bebu hat geschrieben:Ich erzeuge die Expontialdarstellung gar nicht, das macht Sqlite intern.
Dann bilde die Zahl im String Hexadezimal ab. Die Exponentialdarstellung kürzt unter Umständen, bzw. die Darstellung ist evtl. nicht 1:1 zurück zu rechnen.

Re: Was ist das für eine Zahlendarstellung?

Verfasst: So Jan 08, 2012 9:53 pm
von Bebu
Auch eine Möglichkeit. Aber das Problem trat auch nur auf, wenn ich die Zahl in ein Zahlenfeld habe schreiben lassen. Jetzt schreibe ich die Dezimaldarstellung in ein Stringfeld. Damit funktioniert auch die Rückholung wieder wie gewünscht, schließlich bekomme ich den String von Sqlite auch 1:1 wieder so zurück.

Re: Was ist das für eine Zahlendarstellung?

Verfasst: Mo Jan 09, 2012 12:13 am
von Xin
Bebu hat geschrieben:Auch eine Möglichkeit. Aber das Problem trat auch nur auf, wenn ich die Zahl in ein Zahlenfeld habe schreiben lassen. Jetzt schreibe ich die Dezimaldarstellung in ein Stringfeld. Damit funktioniert auch die Rückholung wieder wie gewünscht, schließlich bekomme ich den String von Sqlite auch 1:1 wieder so zurück.
Nicht Sqlite ist hier das Problem, sondern, dass ein Integer in eine nicht zwangsläufig gleichwertige Darstellung konvertiert wird und diese nicht gleichwertige Darstellung bei der Rückkonvertierung eventuell zu einer anderen Integer führt.

Re: Was ist das für eine Zahlendarstellung?

Verfasst: Mo Jan 09, 2012 12:05 pm
von Bebu
Ja, aber diese Problem umgehe ich, indem ich die Darstellung als String speichere.