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度数,还不错:)
单精度浮点数可以指望的分辨率约为360 /(2 ^ 23)或4*10 ^ -5.
更确切地说,最大的单精度浮子严格低于360.(可以精确表示)359.999969.对于整个范围-360. .. 360,您将能够表示至少与这两个数字之间的差异一样小的差异.