Почему абсолютное значение комплексного числа является числом с плавающей запятой?
В python3:
>>> abs(-5) == 5
а также
>>> abs(5) == 5
но
>> abs(5+0j) == 5.0
4 ответа
Абсолютное значение комплексного числа a+bj, определяется как расстояние между началом координат (0,0) и точкой (a,b) в комплексной плоскости. Другими словами, это sqrt (a2 + b2).
Предполагая, что вы знаете об определении нормы комплексного числа, возникает вопрос: почему abs(5j)
возврате 5.0
вместо 5
даже если вы предоставили int
как мнимая составляющая?
Ответ - согласованность типов. поскольку abs
возвращает float
для комплексных чисел нет причин делать особый случай и возвращать int
если результат оказывается круглым числом.
Также обратите внимание, что те же рассуждения применимы к компонентам ваших воображаемых чисел, которые всегда хранятся как float
,
z = 1 + 1j
z.real # 1.0
z.imag # 1.0
Потому что абсолютное значение комплексного числа - это расстояние от начала координат до числа на комплексной плоскости (где две составляющие комплексного числа образуют координаты).
Мнимый i
и реально r
Компоненты комплексного числа можно рассматривать как координаты на плоскости, и вы можете рассчитать расстояние от начала координат ((0, 0)
) с помощью формулы расстояния Пифагора, sqrt(i**2 + r**2)
,
Расстояние может быть выражено как число с плавающей запятой (действительное), мнимой составляющей нет.
Это также не может быть целым числом, потому что расстояние Пифагора не всегда является удобным целым числом (в отличие от абсолютного значения целого числа, которое может быть только другим целым числом).
Я полагаю, что реальный вопрос "Почему Python abs
возвращать целочисленные значения для целочисленных аргументов, но значения с плавающей запятой для комплексных чисел с простым целочисленным значением ".
Относительно аргументов и типов результатов abs
Есть три основных случая:
- аргумент является целым числом ⇒ результат является целым числом; так что можно с уверенностью сказать, что
abs(-5)
возвращает целое число (5). - аргумент реален (с плавающей запятой) ⇒ результат реален; так
abs(5.1)
возвращает число с плавающей запятой (5.1). - Аргумент сложный ⇒ результатом является число с плавающей запятой, но решение о том, имеет ли оно точное целочисленное значение, зависит от значений действительной / мнимой частей аргумента.
Это решение в последнем случае далеко не тривиально: abs (5 + 0i) имеет целочисленное значение, поэтому имеет abs (3 + 4i) (Пифагор), а abs(5+2i) - нет. Другими словами, не имело бы смысла создавать "целочисленный комплексный" тип и предоставлять abs
реализация для этого; результат в большинстве случаев не будет целочисленным.
Поэтому вполне разумно не распространять различие между целым и вещественным числом в поля комплексных чисел. (Это будет работать для дополнения, но практическая выгода будет близка к нулю.)