Sqlalchemy: Breite und Länge Float Precision?

9

Ich benutze Sqlalchemy, um meine Tabellen und so zu definieren, und hier ist ein Code, den ich mir ausgedacht habe:

%Vor%

Ich lese Irgendwo , dass Breiten- und Längengrad eine bessere Genauigkeit erfordern als Floats, normalerweise doppelte Genauigkeit. Also stelle ich die Präzision manuell auf 64, reicht das? Overkill? Würde das sogar für meine Situation helfen?

    
john 07.07.2011, 00:32
quelle

3 Antworten

4

Es hängt davon ab, wofür Sie Ihre Daten verwenden. Wenn Sie einen Float verwenden, ist es in Ordnung, wenn Sie es nur bis etwa Meter Detailtiefe benötigen. Die Verwendung der Daten in graphischen Anwendungen führt zu einem Jitter-Effekt, wenn der Benutzer zu weit hineinzoomt. Weitere Informationen zu Jitter finden Sie unter Precisions, Precisions . Hoffe, das hilft.

    
masebase 07.07.2011, 00:48
quelle
5

Niemand hat hier konkrete Zahlen mit einem Beweis für die Worst-Case-Genauigkeit eines Fließkommas Lat / Long geliefert. Ich musste das für etwas wissen, an dem ich gerade arbeitete, also hier ist meine Analyse für den Fall, dass es jemand anderem hilft.

Ein Gleitkommawert mit einfacher Genauigkeit bietet 24 Bit Genauigkeit im Mantisse (die binäre Exponentialnotation einer Zahl). Wenn der ganze Teil der Zahl größer wird, sinkt die Anzahl der Bits nach der Dezimalzahl. Daher ist die Worst-Case-Genauigkeit für eine geografische Breite oder Länge, wenn die Größe so weit wie möglich von 0 entfernt ist. Unter der Annahme, dass Sie Ihre Breitengrade auf [-90, 90] und Längen von (-180, 180) begrenzen, wird der Worst-Case am Äquator für die Länge 180 sein.

In binär erfordert 180 8 Bits der verfügbaren 24 Bits, wobei 16 Bits hinter dem Dezimalpunkt verbleiben. Daher wäre der Abstand zwischen aufeinanderfolgend darstellbaren Werten an dieser Länge 2 ^ -16 Grad (ungefähr 1,526E-5). Die Multiplikation dieser Zahl (in Radianten) mit dem WGS-84-Radius der Erde am Äquator (6.378.137 m) ergibt eine Worst-Case-Genauigkeit von:

%Vor%

Die gleiche Analyse gegen Lat / Longs, die in Radianten gespeichert sind, ergibt folgendes:

%Vor%

Und schließlich, wenn Sie die Breitengrade auf den Bereich [-1, 1] und die Längengrade auf den Bereich (-1, 1) normieren, können Sie die folgende Worst-Case-Genauigkeit erreichen:

%Vor%

Wenn Sie also lat / long im Bogenmaß speichern, erhalten Sie eine Genauigkeit von etwa 7 Zoll, und wenn Sie sie in normalisierter Form speichern, können Sie im ungünstigsten Fall eine Genauigkeit von etwa 1'8 "erreichen.

Wenn Sie bei der Konvertierung zwischen doppelter Genauigkeit und einfacher Genauigkeit gerundet (statt abgeschnitten), wird der Wert für die einfache Genauigkeit innerhalb der Hälfte der Entfernung zwischen zwei aufeinander folgenden Werten liegen.

    
Jeff G 09.02.2015 21:55
quelle
2

Update : Jeffs Antwort hat eine bessere Analyse. Jedoch ...

Um Jeffs Antwort zu verbessern:

Wenn Sie den tatsächlichen Winkel in Radianten durch π dividieren und somit den Winkel in einer Skala von 0 bis ± 1 kodieren, dann sollten Sie alle Ziffern des Mantisse (23 Bits (24 - 1 Vorzeichen) verwenden können )). Die Genauigkeit wäre dann:

%Vor%

Meine alte Antwort:

Eine 32-Bit Gleitkommazahl kann eine Zahl mit etwa 7.2 Dezimalstellen darstellen. Dies ist eine Annäherung, da die Fließkommazahl tatsächlich binär ist, und wenn sie in Dezimal konvertiert wird, kann die Anzahl der signifikanten Stellen variieren.

Wenn wir es als 6 Dezimalstellen der Genauigkeit nehmen (um auf der sicheren Seite zu spielen), und wenn wir den Breiten- und Längengrad in Grad speichern, erhalten wir eine Genauigkeit von ungefähr 1/1000 eines Grades, was eine Genauigkeit ist von ungefähr 111 Metern im schlimmsten Fall. Im besten Fall, wenn wir 7 Dezimalstellen Genauigkeit erhalten, wäre die Genauigkeit etwa 11,1 Meter.

Es ist möglich, eine bessere Genauigkeit zu erreichen, wenn man Radiant als Einheit verwendet. Im schlimmsten Fall erhalten wir eine Genauigkeit von 10 Millionstel eines Radianten, die etwa 63 Meter beträgt. Im besten Fall wäre es 1 Millionstel eines Radianten, das etwa 6 Meter ist.

Unnötig zu erwähnen, dass eine 64-Bit-Gleitkommazahl extrem präzise wäre (im schlimmsten Fall etwa 6 Mikrometer).

    
HRJ 17.04.2013 10:47
quelle