Swift测量class·角度转换精度
Swift Measurement class · angle conversion accuracy
Swift 4.2 Xcode 10β2
背景
我正在整理一个与天文学相关的 API 来处理我正在开发的应用程序中的数学。目的是使用 Measurement
class 来处理角度和距离的输入和输出。通过这种方式,用户可以使用他们喜欢的单位(例如度或弧度、英里或公里或任何组合)输入数据,并以相同的单位获得输出。
在我测试结果之前,这似乎工作得很好。在一个相对简单的计算中,比如在给定纬度下距地球中心的距离,我得到了大约两公里的误差。
花了几个小时(因为我认为这是计算中的舍入误差)但我最终将问题追溯到 Measurment
class 本身。度和弧度之间的转换系数不准确。它应该是 180.0 / Double.pi
(57.29577951308232...) 但实际上是 57.9528.
代码示例
print(UnitAngle.radians.converter.baseUnitValue(fromValue: 1.0)) // Inaccurate.
print(180.0 / Double.pi) // Accurate.
问题
所以,两个(好的三个)问题:
- 这是一个错误吗?这一定是一个错误。太不准确了。
- 是否可以将转换因子设置为不同的值(或 subclass
Measurement
以实现相同的值)。
- 我应该自己测量 class 还是放弃单位转换的想法并在内部坚持使用 SI 单位? (会很伤心,因为,否则,它完全(原文如此)做了我想要的。)
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
Is this a bug? It must be a bug. It's far too inaccurate.
我会说是的。所有 Measurement
个 API 都采用 Double
个参数和 return
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
Is it possible to set the conversion factor to a different value (or subclass Measurement to achieve the same).
与 类似,您可以
定义你自己的单位:
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
Should I roll my own Measurement class or just abandon the idea of unit conversion and stick to SI units internally?
由您决定:)
Swift 4.2 Xcode 10β2
背景
我正在整理一个与天文学相关的 API 来处理我正在开发的应用程序中的数学。目的是使用 Measurement
class 来处理角度和距离的输入和输出。通过这种方式,用户可以使用他们喜欢的单位(例如度或弧度、英里或公里或任何组合)输入数据,并以相同的单位获得输出。
在我测试结果之前,这似乎工作得很好。在一个相对简单的计算中,比如在给定纬度下距地球中心的距离,我得到了大约两公里的误差。
花了几个小时(因为我认为这是计算中的舍入误差)但我最终将问题追溯到 Measurment
class 本身。度和弧度之间的转换系数不准确。它应该是 180.0 / Double.pi
(57.29577951308232...) 但实际上是 57.9528.
代码示例
print(UnitAngle.radians.converter.baseUnitValue(fromValue: 1.0)) // Inaccurate.
print(180.0 / Double.pi) // Accurate.
问题
所以,两个(好的三个)问题:
- 这是一个错误吗?这一定是一个错误。太不准确了。
- 是否可以将转换因子设置为不同的值(或 subclass
Measurement
以实现相同的值)。 - 我应该自己测量 class 还是放弃单位转换的想法并在内部坚持使用 SI 单位? (会很伤心,因为,否则,它完全(原文如此)做了我想要的。)
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
Is this a bug? It must be a bug. It's far too inaccurate.
我会说是的。所有 Measurement
个 API 都采用 Double
个参数和 return
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
Is it possible to set the conversion factor to a different value (or subclass Measurement to achieve the same).
与
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
Should I roll my own Measurement class or just abandon the idea of unit conversion and stick to SI units internally?
由您决定:)