go语言复数包_Go语言圣经 2.3-复数

Go提供了两种大小的复数类型:complex64和complex128,分别由float32和float64组成。内置函数complex从指定的实部和虚部构建复数,内置函数real和imag用来获取复数的实部和虚部:var x complex128 = complex(1, 2) // 1+2i

var y complex128 = complex(3, 4) // 3+4i

fmt.Println(x*y) // "(-5+10i)"

fmt.Println(real(x*y)) // "-5"

fmt.Println(imag(x*y)) // "10"如果一个浮点数的字面量后面跟着一个i,例如3.141592i或2i,那么它将变成一个复数的虚部,这个复数的实部是0:fmt.Println(1i * 1i) // "(-1+0i)", i² = -1

在常数运算规则中,复数常量可以加到普通数值常量上(整数或浮点,实部或虚部),因此我们可以这样书写复数:1 + 2i 或者等价的 2i + 1。上面的x和y的声明语句可以这样简化:x := 1 + 2i

y := 3 + 4i复数可以通过== 或 !=进行比较。两个复数相等当且仅当它们的实部和虚部都相等(复数底层是浮点数,因此做相等比较的时候要特别小心)

math/cmplx包提供了操作复数的函数,例如求复数的平方根或复数的幂函数:fmt.Println(cmplx.Sqrt(-1)) // "(0+1i)"

下面的程序使用comlex128算法来生成Mandelbrot图像:package main

import (

"image"

"image/color"

"image/png"

"math/cmplx"

"os"

)

func main() {

const (

xmin, ymin, xmax, ymax = -2, -2, +2, +2

width, height = 1024, 1024

)

img := image.NewRGBA(image.Rect(0, 0, width, height))

for py := 0; py < height; py++ {

y := float64(py)/height*(ymax-ymin) + ymin

for px := 0; px < width; px++ {

x := float64(px)/width*(xmax-xmin) + xmin

z := complex(x, y)

// Image point (px, py) represents complex value z.

img.Set(px, py, mandelbrot(z))

}

}

png.Encode(os.Stdout, img) // NOTE: ignoring errors

}

func mandelbrot(z complex128) color.Color {

const iterations = 200

const contrast = 15

var v complex128

for n := uint8(0); n < iterations; n++ {

v = v*v + z

if cmplx.Abs(v) > 2 {

return color.Gray{255 - contrast*n}

}

}

return color.Black

}

程序中有两个循环在逐点读取一个1024 * 1024的灰度珊格图像,该图像对应-2到+2之间的复数平面。程序会测试每个点,计算它们到圆心的距离是否超过2(这些点是否落在半径为2的原点),如果超过了,这个点被它逃逸所用的循环次数所隐藏,如果没有,这个值归属于Mandelbrot集合并使用黑色标记。最终程序将生成的PNG图像输出到辨准输出:

有疑问加站长微信联系(非本文作者)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值