What is the approximate resolution of a single precision floating point number when its around zero
我将许多经度和纬度存储为
要回答这个问题,我需要知道当存储的值为经度/纬度(-180到180)时单精度浮点数的近似分辨率。
您的问题可能有多种解释。
如果它只是用于angular和存储在磁盘或设备上,我建议您使用完全不同的技术存储您的值:存储为 32 位整数。
1 | int encodedAngle = (int)(value * (0x7FFFFFFF / 180.0)); |
要恢复它,请执行相反的操作。
1 | double angle = (encodedAngle / (0x7FFFFFFF / 180.0)); |
通过这种方式,180 度的全 31 位分辨率和符号的 1 位分辨率。
您也可以使用这种方式将您的值保存在 ram 中,与直接使用双打相比,这种覆盖的成本更高,但如果您想保持低内存但高分辨率,这可以很好地工作。
成本并没有那么高,只是从整数到 double 的转换和乘法,现代处理器会在很短的时间内完成,而且由于访问的内存较少,如果列表包含很多值,您的代码将对处理器缓存更加友好。
你的分辨率将是
单精度浮点数的分辨率约为 360 / (2 ^ 23) 或 4 * 10 ^ -5。
更准确地说,严格低于
取决于,但不是。
32 位浮点数存储 7 个有效数字。这通常对于存储经度/纬度的正确分辨率来说太少了。例如,openstreetmap.org 使用小数点后六位,因此最少八位,最多十位。
简而言之,使用float64。
通常浮点数是 4 个字节(32 位),而双精度数是它的两倍。但是,如果您要进行计算,确切的精度是特定于实现(和硬件)的。在某些系统上,所有浮点数都将存储为双精度值,这只是为了增加混乱。