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

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

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

Ответы [ 4 ]

13 голосов
/ 29 октября 2011

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

Если это только для углов и для хранения на диске или на устройстве, я бы посоветовал вам хранить ваши значения, используя совершенно другую технику: хранить как 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 градусов, неплохо:)

5 голосов
/ 29 октября 2011

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

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

1 голос
/ 29 октября 2011

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

0 голосов
/ 29 мая 2014

Зависит, а точнее нет.

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

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

...