#python #math
#python #математика
Вопрос:
Недавно я наткнулся на этот код на Python, вот фрагмент кода:
if abs(i - 0) < SMALL_NUMBER:
# For non-inclined orbits, raan is undefined;
# set to zero by convention
Что меня действительно смущает, так это эта часть:
abs(i - 0)
Есть ли какая-либо законная причина вычитать ноль из числа перед передачей его в abs()
? Кажется, нет никакой математической причины, но, возможно, в языке есть какая-то причуда?
Комментарии:
1. Я бы понял
i - 0.0
, но здесь…2. Честно говоря, я не думаю, что есть какая-либо причина для этого, кроме попытки проверки типа.
3. Добавлен фрагмент кода. Код взят из библиотеки orbital math, но вопрос на самом деле не связан с orbital math, кроме этого и ссылки, которую я не могу предоставить больше контекста.
4. Что такое
i
? Возможно, это также даст вам подсказку, чемi - 0
отличается отi
.5. Может быть, попробуйте связаться с автором по этому поводу. Я тоже не могу придумать законной причины для этого.
Ответ №1:
Мы можем только догадываться, но этот код
abs(i - 0)
пытается ли материализовать расстояние между i
и 0
, как мы бы сделали
abs(x - y)
Кроме того, вычитание / добавление 0 не изменяет значение числа с плавающей точкой (иначе это означало бы, что непрерывное добавление 0 приведет к смещению числа …)
Обратите внимание, что это связано с затратами на процессор:
>>>
6 0 LOAD_GLOBAL 0 (abs)
3 LOAD_GLOBAL 1 (i)
6 LOAD_CONST 1 (0) <=== not optimized out
9 BINARY_SUBTRACT <=== not optimized out
10 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
13 RETURN_VALUE
Комментарии:
1. согласен с вами, может
0
быть, это просто математическое значение.2. Я думаю, что автор пытается сформулировать концепцию «сколь угодно близко к 0».
3. да, вероятно. Но это не бесплатно, как показывает разборка
4. Тогда я предполагаю, что было бы неплохо удалить их с точки зрения производительности в дополнение к «это сбивает с толку»?
5. влияние tbh на производительность, вероятно, очень незначительно. Но я бы не стал писать это так 🙂