【问题标题】:What is the approximate resolution of a single precision floating point number when its around zero单精度浮点数在零附近时的近似分辨率是多少
【发布时间】:2011-12-17 14:09:45
【问题描述】:

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

要回答这个问题,我需要知道single precision floating point number 在存储值为经度/纬度(-180 到 +180)时的近似分辨率。

【问题讨论】:

  • 经度从 -180 到 180,纬度从 -90 到 90。

标签: c types floating-point double resolution


【解决方案1】:

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

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

【讨论】:

  • 太棒了,根据我的计算,经度/纬度的最大距离约为 5 米,这对我来说是不可接受的。感谢您的帮助!
  • @Robert 当您需要统一分辨率时,浮点格式有点浪费(尽管我承认它们非常方便)。对于单精度浮点数,当您可以有 2 ^ 32 个均匀间隔的值时,分辨率会受到 23 位尾数的限制。对于双精度,分辨率受 52 位尾数的限制,您可以使用所有 64 位来表示均匀间隔的值。
【解决方案2】:

通常浮点数是 4 个字节(32 位),而双精度数是它的两倍。但是,如果您要进行计算,确切的精度是特定于实现(和硬件)的。在某些系统上,所有浮点数都将存储为双精度数,这只是为了增加混乱。

【讨论】:

    【解决方案3】:

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

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

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

    要恢复它,请执行相反的操作。

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

    这样一来,180 度的全 31 位分辨率和符号的 1 位分辨率。

    您也可以使用这种方式将值保存在 ram 中,与直接使用双精度值相比,这种覆盖的成本更高,但如果您想保持低内存但高分辨率,这可以很好地工作。 成本并没有那么高,只是从整数到 double 的转换和乘法,现代处理器会在很短的时间内完成,而且由于访问的内存较少,如果列表包含很多值,您的代码将对处理器缓存更加友好。

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

    【讨论】:

    • 他不能使用无符号整数,因为他必须表示从 -360 到 360 的值。很好的答案。
    • 对于纬度/经度,+-360 肯定是一个虚假的要求......无论如何,这个答案是正确的,使用浮点绝对是错误的,除非你想要伦敦附近的高精度和可怕的量化太平洋...
    • @SalvatorePreviti 感谢您的回答,它有助于将我的二进制大小从 21mb 减少到 17mb。现在可以通过无线方式下载!
    • 纬度实际上是从 -90 到 90。所以对于纬度,您可以在上述编码/解码方程中用 90 代替 180。
    【解决方案4】:

    取决于,但不是。

    32 位浮点数存储 7 个有效数字。这通常对于存储经度/纬度的正确分辨率来说太少了。例如,openstreetmap.org 使用小数点后六位,因此最少八位,最多十位。

    简而言之,使用 float64。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多