Каково приблизительное разрешение числа с плавающей запятой одинарной точности, когда оно около нуля

Я храню много долгот и широт как doubles, мне интересно, смогу ли я сохранить их как floats.

Чтобы ответить на этот вопрос, мне нужно знать приблизительное разрешение числа одинарной точности с плавающей запятой. когда сохраненными значениями являются долгота/широта (от -180 до +180).


person Robert    schedule 28.10.2011    source источник
comment
Долгота варьируется от -180 до 180, а широта от -90 до 90.   -  person caf    schedule 29.10.2011


Ответы (4)


Ваш вопрос может иметь несколько интерпретаций.

Если это только для углов и для хранения на диске или на устройстве, я бы предложил вам хранить ваши значения, используя совершенно другую технику: хранить как 32-битное целое число.

int encodedAngle = (int)(value * (0x7FFFFFFF / 180.0));

Чтобы восстановить его, сделайте наоборот.

double angle = (encodedAngle / (0x7FFFFFFF / 180.0));

Таким образом, у вас есть полное 31-битное разрешение для 180 градусов и 1 бит для знака.

Вы также можете использовать этот способ для хранения ваших значений в оперативной памяти, стоимость этого покрытия выше по сравнению с работой напрямую с двойниками, но если вы хотите, чтобы ваша память была низкой, но высокое разрешение, это может работать довольно хорошо. Стоимость не такая уж и высокая, просто преобразование в/из целого числа из/в двойное и умножение, современные процессоры сделают это за очень мало времени, а так как доступной памяти меньше, то если список содержит много значений, ваш код будет более дружественным к кэшу процессора.

Ваше разрешение будет 180 / ((2^31) - 1) = 8.38190318 × 10^-8 градусов, неплохо :)

person Salvatore Previti    schedule 28.10.2011
comment
Он не может использовать целые числа без знака, потому что должен представлять значения от -360 до 360. Хороший ответ. - person Pascal Cuoq; 29.10.2011
comment
Для широты и долготы +-360, безусловно, является фиктивным требованием ... В любом случае этот ответ правильный, и использование с плавающей запятой определенно неправильно, если только вам не нужна большая точность возле Лондона и ужасное квантование в Тихом океане ... - person R.. GitHub STOP HELPING ICE; 29.10.2011
comment
@SalvatorePreviti Спасибо за ваш ответ, он помог уменьшить размер моего двоичного файла с 21 МБ до 17 МБ. Теперь его можно скачать по воздуху! - person Robert; 08.11.2011
comment
широта на самом деле изменяется от -90 до 90. Таким образом, для широты вы можете просто заменить 90 на 180 в приведенных выше уравнениях кодирования/декодирования. - person Markus; 17.10.2017

Разрешение, на которое можно рассчитывать с плавающей точкой одинарной точности, составляет около 360/(2^23) или 4*10^-5.

Точнее, самое большое число с плавающей запятой одинарной точности, строго уступающее 360. (которое можно точно представить), составляет около 359.999969. Для всего диапазона -360. .. 360 вы сможете представить различия, по крайней мере, столь же маленькие, как разница между этими двумя числами.

person Pascal Cuoq    schedule 28.10.2011
comment
Фантастика, по моим расчетам, это максимум 5 метров на долготу/широту, что для меня неприемлемо. Спасибо за помощь! - person Robert; 29.10.2011
comment
@Robert Когда вам нужно единое разрешение, форматы с плавающей запятой немного расточительны (хотя я бы признал, что они очень удобны). В случае с плавающей запятой одинарной точности разрешение ограничено 23-битной мантиссой, тогда как у вас может быть 2 ^ 32 равномерно распределенных значения. Для двойной точности разрешение ограничено 52-битной мантиссой, где вы можете использовать все 64 бита для представления равномерно распределенных значений. - person Pascal Cuoq; 29.10.2011

Обычно числа с плавающей запятой имеют размер 4 байта (32 бита), а числа с плавающей запятой в два раза больше. Однако точная точность, если вы выполняете вычисления, зависит от реализации (и аппаратного обеспечения). В некоторых системах все числа с плавающей запятой будут храниться как двойные, просто чтобы добавить путаницы.

person FeifanZ    schedule 28.10.2011

Зависит, но скорее нет.

32-битное число с плавающей запятой хранит 7 значащих цифр. Обычно этого слишком мало для хранения правильного разрешения долготы/широты. Например, openstreetmap.org использует шесть цифр после запятой, поэтому минимум восемь, максимум десять цифр.

Короче говоря, используйте float64.

person Michał Leon    schedule 29.05.2014