【发布时间】:2011-12-12 16:53:07
【问题描述】:
我看到人们使用这两种变体... 就是不知道iOS5的float不够用?
【问题讨论】:
标签: core-data ios5 core-location
我看到人们使用这两种变体... 就是不知道iOS5的float不够用?
【问题讨论】:
标签: core-data ios5 core-location
如今,这并不重要。
double 只是一个浮点值槽,它的精度是标准浮点数的两倍。除非您强制它使用浮点数,否则 Objective-c 编译器实际上会将所有浮点值存储为双精度值。
Floats 和 Doubles 在很大程度上是记忆超紧的旧时代的遗留物。这些天来,您通常只会在字符串格式方面看到它们不同。各种大小的int也是一样的。除非您强制编译器执行其他操作,否则所有大小都存储在最大可用大小中。
【讨论】:
32 位浮点数保存 7 位精度,64 位双精度数保存 15 位精度。
在 7 位精度下,最大经度 179.9999 仅精确到 0.0001 度。 1 度约为 60 海里,因此 0.0001 度约为 10 米(33 英尺)。如果要存储更精确的纬度/经度值,则需要使用双精度(或定点整数)。
【讨论】:
为了回答您在使用浮点数或双精度时的准确度,我想出了这个答案:
存储为 E/W 和 N/S 的十进制数字时的最差情况精度:
您可以通过在 Java 中运行来自己进行计算:
public class Main {
public static void main(String[] args) {
System.out.println(Math.ulp((float) 180) * 60 * 1852);
System.out.println(Math.ulp((double) 180) * 60 * 1852);
}
}
我知道这是一个旧线程,但我在搜索问题时发现了它。对于大多数应用程序来说,浮点数很可能就足够了。有问题的 Apple 设备的 GPS 可能没有比这更好的精度。但只要数据不是问题,存储双精度数会更容易。
【讨论】:
最近,我认为在可转换属性中将坐标存储为 NSValue 在 Core Data 中更容易:
[NSValue valueWithMKCoordinate:coordinate]
https://developer.apple.com/documentation/foundation/nsvalue/1452193-valuewithmkcoordinate
【讨论】: