为啥复数的绝对值是浮点数?

Posted

技术标签:

【中文标题】为啥复数的绝对值是浮点数?【英文标题】:Why is the absolute value of a complex number a floating point number?为什么复数的绝对值是浮点数? 【发布时间】:2018-03-09 19:13:12 【问题描述】:

在python3中:

>>> abs(-5) == 5

>>> abs(5) == 5

但是

>> abs(5+0j) == 5.0

【问题讨论】:

因为它在数学上是这样定义的:实部和虚部的规范。对吗? 这不是一个真正的 Python 问题。见varsitytutors.com/hotmath/hotmath_help/topics/… 5.0 == 5 怎么样? 如果abs 的参数是整数,那么结果也必须是整数;所以有一个特殊的整数abs 方法是有意义的。但复数的绝对值不一定是整数,即使实部和虚部是整数;所以有一个“整数复数”abs 方法是没有意义的(即使有一个“整数复数”数据类型)。 【参考方案1】:

复数a+bj的绝对值,定义为复平面上原点(0,0)到点(a,b)的距离。换句话说,就是 sqrt(a2 + b2)。

【讨论】:

您的陈述绝对正确,但没有回答问题。在这种特殊情况下,sqrt(5^2 + 0^2) = 5。看起来像一个整数,但该函数返回一个实数,这与 abs() 函数不同,当输入一个整数时,它返回一个整数。下面回答得更好。 @DanSp。您只是因为不符合您对 OP 问题的理解而对所有答案投了反对票。如果您认为某个答案不正确,您可以随意投反对票,但请记住,对问题进行多样化的解释可能会导致出现更好的答案。【参考方案2】:

我认为真正的问题是“为什么 Python 的 abs 为整数参数返回整数值,而为具有纯整数值的复数返回浮点值。”

关于abs的参数和结果类型,主要有三种情况:

参数是整数⇒结果是整数;所以可以肯定地说abs(-5) 返回一个整数 (5)。 参数是真实的(浮点数)⇒结果是真实的;所以abs(5.1) 返回一个浮点数 (5.1)。 参数很复杂 ⇒ 结果是一个浮点数,但它是否具有精确整数值的决定取决于参数的实部/虚部的值。

最后一种情况下的这个决定远非微不足道:abs(5+0i) 有一个整数值,abs(3+4i) 也是如此(毕达哥拉斯)但 abs(5+2i) 没有。换句话说,创建一个“整数复数”类型并为其提供abs 实现是没有意义的;结果在大多数情况下不是整数。

因此,不将整数/实数的区别扩展到复数域是非常明智的。 (它适用于加法,但实际收益将接近于零。)

【讨论】:

最后,有人试图解决实际问题。那么他在复数中的论点是整数。更可能的是必须取平方根的事实。即使提供整数值,平方根函数也可能总是返回一个实数值。 sqrt(5^2 + 0^2) = 5.0 @Dan Sp. – 我认为你是对的,sqrt 函数在这里发挥了作用。与实数/整数 abs 函数相反,对于 sqrt 函数,结果的整数性不是由参数的 type 决定的,而仅由其 value 决定我>。并且类型化编程语言喜欢仅通过参数 types 重载其方法。没有参数值的重载,更不用说结果值了。而且,正如我所说,为了考虑一个数字的实部/虚部的整数性,有必要引入一个没有什么用处的“整数复数”类型。 是的,Gaussian integers(“整数复数类型”)在加法和乘法下是封闭的,但在涉及平方根时肯定不是。没有理由期望高斯整数的复模数(绝对值)通常是整数。 确实,内在的 25 ** .5 = 5.0 即使 25 和答案 5 具有整数值。此外,数学模块中的 math.sqrt() 函数返回一个实数,与输入无关。【参考方案3】:

假设您知道复数范数的定义,那么您的问题就变成了:为什么 abs(5j) 返回 5.0 而不是 5,即使您提供了 int 作为虚数?

答案是类型一致性。由于abs 为复数返回float,因此如果输出恰好是整数,则没有理由制作特殊情况并返回int

另外,请注意,同样的推理也适用于您的虚数分量,它们始终存储为float

z = 1 + 1j
z.real # 1.0
z.imag # 1.0

【讨论】:

abs() 如果输入整数,则不返回浮点数,而是返回整数。他想知道为什么当他在一个复杂变量中输入整数值时,它会返回一个实数。好吧,没有“整数”复杂类型。 (不会很有用。)即使他键入整数系数,复数也存储为两个实数,因此复数的 abs() (具有整数外观系数)总是返回一个实数。 @DanSp。我相信您可能误读了我的答案,因为这就是我要解释的内容。尽管这种误解导致我改进了我认为您可能会发现模棱两可的部分,但我并不是说 abs 总是 无论输入如何都会返回一个浮点数。【参考方案4】:

因为复数的绝对值是从原点到复平面上数字的距离(复数的两个分量形成坐标)。

复数的虚部i和实部r可以看成是平面上的坐标,可以用毕达哥拉斯距离公式sqrt(i**2 + r**2)计算到原点((0, 0))的距离.

距离可以表示为浮点(实)数,没有虚部。

它也不能是整数,因为毕达哥拉斯距离并不总是一个方便的整数(不像整数的绝对值,它只能是另一个整数)。

【讨论】:

他不是在问为什么没有虚部,而是在问为什么它返回的是实数而不是整数。他的示例答案恰好是一个整数。 abs() 函数在输入整数时返回一个整数。 @DanSp:这还不是很清楚。没有任何地方说明他们的预期。我们唯一确定的是他们没想到会有浮动。您在这里对他们不理解的内容做出假设。 你是对的,他并不期待浮动。但是随后给出了故意整数的示例,然后询问具有整数系数的复数。他没有在任何地方询问 abs() 对复数意味着什么。我认为他在问什么很明显,我对我真诚地认为甚至没有解决问题的答案投了反对票。我删除了我的反对票,因为我的行为有推定。

以上是关于为啥复数的绝对值是浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

python中1.0是浮点数还是整数

浮点数和整数相加并取绝对值

什么是浮点数格式?

如何检查字符串是浮点数还是整数?

frame的数值如果是浮点数,该怎么取舍只保留小数点后1位

如何检查数字是浮点数还是整数?