【问题标题】:Swift Measurement class · angle conversion accuracy快速测量类·角度转换精度
【发布时间】:2018-12-12 01:03:23
【问题描述】:

Swift 4.2 Xcode 10β2

背景

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

在我测试结果之前,这似乎工作得很好。在一个相对简单的计算中,比如在给定纬度到地球中心的距离,我得到了大约两公里的误差。

花了几个小时(因为我认为这是计算中的舍入错误),但我最终将问题追溯到 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. 我应该推出自己的测量类还是放弃单位转换的想法并在内部坚持使用 SI 单位? (会很伤心,因为否则,它确实(原文如此)我想要的。)

【问题讨论】:

    标签: swift xcode units-of-measurement


    【解决方案1】:
    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 的实现):

    欢迎使用 Swift 4.2-dev 版本(LLVM ec4d8ae334、Clang 5a454fa3d6、Swift 0ca361f487)。输入 :help 寻求帮助。 1> 导入基础 2> 打印(UnitAngle.radians.converter.baseUnitValue(fromValue: 1.0)) 57.29577951308232 3> 打印(180.0 / .pi) 57.29577951308232 4>打印(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 单位?

    这由你决定:)

    【讨论】:

    • 勘误表:上面的“preciseRadians”应该是 UnitAngle 而不是 UnitLength。一旦进行了校正,那么准确度就会增加至少 8 个数量级。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多