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 mainimport ("image""image/color""image/png""math/cmplx""os"
)func main() {const (xmin, ymin, xmax, ymax = -2, -2, +2, +2width, height          = 1024, 1024)img := image.NewRGBA(image.Rect(0, 0, width, height))for py := 0; py < height; py++ {y := float64(py)/height*(ymax-ymin) + yminfor px := 0; px < width; px++ {x := float64(px)/width*(xmax-xmin) + xminz := 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 = 200const contrast = 15var v complex128for n := uint8(0); n < iterations; n++ {v = v*v + zif cmplx.Abs(v) > 2 {return color.Gray{255 - contrast*n}}}return color.Black
}

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

文章所有权:Golang隐修会 联系人:孙飞,CTO@188.com!

Go语言核心之美 2.3-复数相关推荐

  1. Go语言核心之美-必读

    Go语言核心之美开篇了!,无论你是新手还是一代高人,在这个系列文章中,总能找到你想要的! 博主是计算机领域资深专家并且是英语专8水平,翻译标准只有三个:精确.专业.不晦涩,为此每篇文章可能都要耗费数个 ...

  2. Go语言核心之美 2.6-常量

    在Go语言中,常量表达式是在编译期求值的,因此在程序运行时是没有性能损耗的.常量的底层类型是前面提过的基本类型:布尔值,字符串,数值变量. 常量的声明方式和变量很相似,但是常量的值是不可变的,因此在运 ...

  3. Go语言核心之美 3.4-Struct结构体

    struct(结构体)也是一种聚合的数据类型,struct可以包含多个任意类型的值,这些值被称为struct的字段.用来演示struct的一个经典案例就是雇员信息,每条雇员信息包含:员工编号,姓名,住 ...

  4. Go语言核心之美 2.1-整数

    第二章 序 在计算机底层,一切都是比特位.然而计算机一般操作的都是固定大小的值,称之为字(word).字会被解释为整数.浮点数.比特位数组.内存地址等,这些字又可以进一步聚合成数据包(packet). ...

  5. Go语言核心之美 3.3-Map

    哈希表是一种非常好用.适用面很广的数据结构,是key-value对的无序集合.它的key是唯一的,通过key可以在常数复杂度时间内进行查询.更新或删除,无论哈希表有多大. Go语言的map类型就是对哈 ...

  6. Go语言核心之美 1.5-作用域

    变量的作用域是指程序代码中可以有效使用这个变量的范围.不要将作用域和生命期混在一起.作用域是代码中的一块区域,是一个编译期的属性:生命期是程序运行期间变量存活的时间段,在此时间段内,变量可以被程序的其 ...

  7. Go语言核心之美 1.4-包和文件

    一.Package Go语言中的包(Package)就像其它语言的库(Library)或模块(Module)一样,支持模块化,封装性,可重用性,单独编译等特点.包的源码是由数个.go文件组成,这些文件 ...

  8. Go语言核心之美 1.2-变量及声明篇

    变量 1.声明变量 使用var关键字可以创建一个指定类型的变量: var i int = 0 var i = 0 var i int 以上三个表达式均是合法的,第三个表达式会将i初始化为int类型的零 ...

  9. Go语言核心之美 2.5-字符串

    字符串是不可变的字节序列,虽然可以包含任意数据,包括0这个字节,不过字符串通常是用来包含可读性较强的文本.文本字符串通常采用UTF-8编码,由Unicode码点(rune)组成. 内置的len函数会返 ...

最新文章

  1. TabLayout 遇到那些坑 tab标签不显示问题
  2. 蚂蚁上市挂牌,员工激励人均超800万,你以为创业真的那么容易么?
  3. 测试逐飞的MM32F3277 MicroPython开发板的基本功能
  4. @echo 与 echo的区别
  5. java基础学习整理(一)
  6. golang函数入门示例
  7. 基于android的百度地图_百度的71个炸天的开源项目
  8. java 分布式同步锁_java编程进阶之路:回归锁的本质,探索分布式锁之源头
  9. Scrapy框架结合Spynner采集需进行js,ajax动态加载的网页并提取网页信息(以采集微信公众号文章列表为例)
  10. C语言情人节浪漫烟花表白代码
  11. Swift游戏实战-跑酷熊猫 02 创建熊猫类
  12. windows7无法登陆网络上的计算机,win7电脑网络连接显示感叹号无法上网怎么处理...
  13. 【论文阅读】Occupancy Networks: Learning 3D Reconstruction in Function Space
  14. 图像的二维频谱图的理解 20170622
  15. 计算机管理映像路径,windows任务管理器显示映像路径和命令行设置参考
  16. henauOJ055(猴子吃桃)
  17. C++复数的具体实现
  18. 什么是数字证书、公钥私钥
  19. 动手改善Google PageSpeed
  20. 实验记录二 示例程序

热门文章

  1. 利用B站《无价之姐》弹幕合成词云跳舞
  2. pikachu漏洞平台靶场练习 总结 wp
  3. python 爬虫 简单爬虫教程(requests + selenium )
  4. android 串口转usb,方口并口打印线
  5. C++在终端、文件中就地覆盖输出的方法
  6. 不要用for in 不要用for in 不要用for in 尤其在JavaScript 遍历document时
  7. 连续词袋模型(Continous bag of words, CBOW)
  8. Win10版本那么多怎么区别
  9. cve-2018-1273复现思路及简单利用(避坑)
  10. orCAD中的文本编辑框如何换行?