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

时间:2011-10-28 20:35:20

标签: c types floating-point double resolution

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

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

4 个答案:

答案 0 :(得分:13)

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

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

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

要恢复它,请相反。

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

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

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

你的决议将是180 / ((2^31) - 1) = 8.38190318 × 10^-8度,不错:)

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

取决于,但不是。

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

简而言之,请使用float64。