分享
  1. 首页
  2. 文章

Go语言圣经 2.3-复数

abv123456789 · · 10218 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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)", i2 = -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图像输出到辨准输出:





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

本文来自:CSDN博客

感谢作者:abv123456789

查看原文:Go语言圣经 2.3-复数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
10218 次点击 ∙ 1 赞
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏