当单个精度浮点数大约为零时,它的近似分辨率是多少

Rob*_*ert 8 c floating-point double types resolution

我存储了许多经度和纬度doubles,我想知道我是否可以将它们存储起来floats.

要回答这个问题,当存储的值是经度/纬度(-180到+180)时,我需要知道单个精度浮点数的近似分辨率.

Sal*_*iti 13

您的问题可能有多种解释.

如果它仅用于角度和存储在磁盘或设备上,我建议您使用完全不同的技术存储您的值:存储为32位整数.

int encodedAngle = (int)(value * (0x7FFFFFFF / 180.0));
Run Code Online (Sandbox Code Playgroud)

要恢复它,请相反.

double angle = (encodedAngle / (0x7FFFFFFF / 180.0));
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得180度的完整31位分辨率和1位的符号.

您也可以使用这种方式将您的值保持在ram中,与直接使用双精度相比,此变换的成本更高,但如果您希望保持低内存但分辨率高,则可以很好地工作.成本不是那么高,只是转换为/从整数转换为/从倍和现在的处理器将在很短的时间内完成,并且由于访问的内存较少,如果列表包含大量的值,您的代码将更友好的处理器缓存.

你的分辨率将是180 / ((2^31) - 1) = 8.38190318 × 10^-8度数,还不错:)

  • 对于lat/long,+ -360肯定是一个虚假的要求......无论如何这个答案是正确的,使用浮点肯定是错误的,除非你想在伦敦附近有很高的精度和在太平洋的可怕量化...... (2认同)
  • @SalvatorePreviti感谢您的回答,它有助于将我的二进制大小减少到21mb到17mb.它现在可以通过空中下载! (2认同)

Pas*_*uoq 5

单精度浮点数可以指望的分辨率约为360 /(2 ^ 23)或4*10 ^ -5.

更确切地说,最大的单精度浮子严格低于360.(可以精确表示)359.999969.对于整个范围-360. .. 360,您将能够表示至少与这两个数字之间的差异一样小的差异.

  • @Robert 当您需要统一分辨率时,浮点格式有点浪费(尽管我承认它们非常方便)。对于单精度浮点数,当您可以有 2 ^ 32 个均匀间隔的值时,分辨率受到 23 位尾数的限制。对于双精度,分辨率受 52 位尾数的限制,您可以使用所有 64 位来表示均匀间隔的值。 (2认同)