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.
Вопросы
Итак, два (нормально три) вопроса:
- Это ошибка? Это должно быть ошибка. Это слишком неточно.
- Можно ли установить коэффициент преобразования на другое значение (или подкласс
Measurement
для достижения того же).
- Должен ли я свернуть свой собственный класс измерений или просто отказаться от идеи преобразования единиц и придерживаться внутренних единиц СИ? (Было бы грустно, потому что, в противном случае, это именно то, что я хочу.)