Swift Measurement类·角度转换精度

时间:2018-07-03 16:28:43

标签: swift xcode units-of-measurement

Swift 4.2 Xcode10β2

背景

我正在整理一个与天文学有关的API,以处理我正在使用的应用程序中的数学运算。目的是使用Measurement类来处理角度和距离的输入和输出。这样,用户可以使用自己喜欢的单位(例如度或弧度,英里或公里或任何组合)输入数据,并以相同单位获得输出。

在我测试结果之前,这似乎工作得很好。通过相对简单的计算,例如在给定纬度下距地球中心的距离,我得到的误差约为2公里。

花了几个小时(因为我认为这是四舍五入的错误)​​,但最终我将问题追溯到Measurment类本身。度和弧度之间的转换因子不准确。应该是180.0 / Double.pi(57.29577951308232 ...),但应该是57.9528。

代码示例

print(UnitAngle.radians.converter.baseUnitValue(fromValue: 1.0))  // Inaccurate.
print(180.0 / Double.pi)                                          // Accurate.

问题

因此,有两个(确定三个)问题:

  1. 这是一个错误吗?它一定是一个错误。太不准确了。
  2. 是否可以将转换因子设置为其他值(或通过子类Measurement来实现相同的值。)
  3. 我应该自己开设自己的Measurement课程还是放弃单位换算的想法,而在内部坚持使用SI单位? (会很伤心,因为否则,它会(确实)满足我的要求。)

1 个答案:

答案 0 :(得分:2)

import Foundation

print(UnitAngle.radians.converter.baseUnitValue(fromValue: 1.0)) // 57.2958
print(180.0 / .pi) // 57.2957795130823
print(UnitAngle.radians.converter.baseUnitValue(fromValue: .pi)) // 180.00006436155007
  

这是一个错误吗?它一定是一个错误。太不准确了。

我会说是的。所有Measurement API都使用Double参数并返回 Double个值。这种大的偏差不能简单地用 浮点数不正确,导致结果对严肃的工作毫无用处 具有三角函数。

有趣的是,结果在Ubuntu Linux上是正确的(其中开源 使用Units.swift的实现):

Welcome to Swift version 4.2-dev (LLVM ec4d8ae334, Clang 5a454fa3d6, Swift 0ca361f487). Type :help for assistance.
  1> import Foundation

  2> print(UnitAngle.radians.converter.baseUnitValue(fromValue: 1.0))
57.29577951308232

  3> print(180.0 / .pi)
57.29577951308232

  4> print(UnitAngle.radians.converter.baseUnitValue(fromValue: .pi))
180.0
  

是否可以将转换系数设置为不同的值(或子类Measurement以实现相同的值)。

Swift - Measurement convert(to:) miles to feet gives wrong result类似,您可以 定义自己的单位:

extension UnitAngle {
    static let preciseRadians = UnitAngle(symbol: "rad",
                        converter: UnitConverterLinear(coefficient: 180.0 / .pi))
}

print(UnitAngle.preciseRadians.converter.baseUnitValue(fromValue: 1.0)) // 57.2957795130823
print(UnitAngle.preciseRadians.converter.baseUnitValue(fromValue: .pi)) // 180.0
  

我应该放弃自己的Measurement课程还是放弃单位换算的想法,而在内部坚持使用SI单位?

由您决定:)