Julia 的复数和有理数

                     

贡献者: xzllxls

   本文授权转载自郝林的 《Julia 编程基础》。原文链接:第 5 章 数值与运算

1. 5.4 复数和有理数

5.4.1 复数

   Julia 预定义的复数类型是 Complex。它是 Number 的直接子类型。为了构造出复数的虚部,Julia 还专门定义了一个常量 im。这里的 im 是 imaginary 的缩写。它使用起来是这样的:

julia> 1 + 2im; typeof(1+2im)
Complex{Int64}

julia> 1.1 + 2.2im; typeof(1.1+2.2im)
Complex{Float64}

julia>

   可以看到,Complex 是一个参数化的类型。因为在其名称的右侧还有一个由花括号包裹的类型参数。这个类型参数会是一个代表了某个类型的标识符。关于参数化类型,我们在下下一章就会讲到。

   为了使常见的数学公式和表达式更加清晰,Julia 允许在变量之前紧挨一个数值字面量,以表示两个数相乘。比如,如果变量 x 的值是整数 8,那么 2x^3 就表示 2 乘以 83 次方。又比如,2^3x 表示 224 次方。在这种情况下,变 x 就被称为数值字面量系数(numeric literal coefficient)。

   正因为如此,我们才需要特别注意,上例中的 2im2.2im 虽然看起来与这种表示法非常相似,但其含义却是完全不同的。整数或浮点数的字面量与常量 im 共同组成的是一个复数的虚部。而且还要注意,在构造复数的虚部时,我们就不能再使用数值字面量系数了。因为这肯定会产生歧义。比如,1 + 2xim 就是不合法的,除非已经存在一个名为 xim 的变量,但如此一来这表示的就不是一个复数了。如果必须有变量参与复数的构造,那么我们可以使用 complex 函数,例如:complex(1, 2x)

   Julia 允许复数参与标准的数学运算。所以,下面的这些数学表达式是合法的:

julia> (1 + 2im) + (3 + 4im)
4 + 6im

julia> (1 + 2im) - (3 + 4im)
-2 - 2im

julia> (1 + 2im) * (3 + 4im)
-5 + 10im

julia> (1 + 2im) / (3 + 4im)
0.44 + 0.08im

julia> 3(1 + 2im)^8
-1581 + 1008im

julia>

   例子中的圆括号代表着对运算次序的设定。这与它在数学中的一般含义是一致的。

   要想分别得到一个复数的实部和虚部,我们就需要调用 real 函数和 imag 函数。示例如下:

julia> com1 = 1 + 2im 
1 + 2im

julia> real(com1), imag(com1)
(1, 2)

julia>

   另外,我们还可以利用、conj 函数求出一个复数的共轭(conjugate),以及使用 abs 函数计算出一个复数与 0 之间的距离,等等。总之,Julia 预定义的很多数学函数都可以应用于复数。

5.4.2 有理数

   我们在前面说过,浮点数无法精确地表示所有小数。比如,1/3 是一个无限循环小数,但用浮点数表示的话只能是这样的:

julia> 1/3
0.3333333333333333

julia> typeof(ans)
Float64

julia>

   严格来说,1/3 并不是一个浮点数。因为浮点数会对无限循环小数做舍入,这会损失精度。但是,它肯定是一个有理数。

   在 Julia 中,有理数用于表示两个整数之间的精确比率。有理数的类型是 Rational。它的值可以由操作符 // 来构造。代码如下:

julia> 1//3
1//3

julia> typeof(ans)
Rational{Int64}

julia>

   在操作符 // 左侧的被称为分子,而在它右侧的被称为分母。注意,这两个数都只能是整数,而不能是浮点数。

   如果在分子和分母之间存在公因数,那么 Julia 会自动地把它们化为最小项并让分母变为非负整数。例如:

julia> 3//9
1//3

julia> 3//-9
-1//3

julia> 42//126
1//3

julia>

   函数 numeratordenominator 可以让我们分别得到一个有理数的分子和分母:

julia> rat1 = 1//3
1//3

julia> numerator(rat1)
1

julia> denominator(rat1)
3

julia>

   有理数可以参与标准的数学运算。比如,我们可以拿一个有理数与一个整数、浮点数或者其他有理数进行比较。又比如,我们可以对有理数进行加减乘数等运算。另外,有理数也可以很容易地被转换为浮点数。例如:

julia> float(1//3) 
0.3333333333333333

julia>

   我在前面也说了,这实际上会存在精度上的损失。

   最后,需要我们注意的是,0//0 是不合法的。该字面量会引发一个错误。相应的,表示浮点数的字面量 0/0 等同于 NaN。从技术标准的角度讲,NaN 不与任何东西(包括它自己)相等。


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利