gpt4 book ai didi

Swift Measurement class·角度转换精度

转载 作者:可可西里 更新时间:2023-11-01 01:08:40 27 4
gpt4 key购买 nike

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 单位? (会很伤心,因为,否则,它完全(原文如此)做我想要的。)

最佳答案

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 参数并返回 值。这种大的偏差不能简单地用 float 不准确,并使结果对严肃的工作无用具有三角函数。

有趣的是,结果在 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).

Similarly as in Swift - Measurement convert(to:) miles to feet gives wrong result, you candefine your own unit:

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 Measurement class·角度转换精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51159254/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com