当前位置:网站首页>Go 数据类型篇(四)之浮点型与复数类型
Go 数据类型篇(四)之浮点型与复数类型
2022-06-28 02:39:00 【weixin_59284282】
浮点型
浮点型也叫浮点数,用于表示包含小数点的数据,比如 3.14、1.00 都是浮点型数据。
浮点数的表示
Go 语言中的浮点数采用IEEE-754 标准的表达方式,定义了两个类型:float32 和 float64,其中 float32 是单精度浮点数,可以精确到小数点后 7 位(类似 PHP、Java 等语言的 float 类型),float64 是双精度浮点数,可以精确到小数点后 15 位(类似 PHP、Java 等语言的 double 类型)。
在 Go 语言里,定义一个浮点型变量的代码如下:
var floatValue1 float32
floatValue1 = 10
floatValue2 := 10.0 // 如果不加小数点,floatValue2 会被推导为整型而不是浮点型
floatValue3 := 1.1E-10对于浮点类型需要被自动推导的变量,其类型将被自动设置为 float64,而不管赋值给它的数字是否是用 32 位长度表示的。因此,对于以上的例子,下面的赋值将导致编译错误:
floatValue1 = floatValue2 // floatValue2 是 float64 类型
编译错误信息如下:
cannot use floatValue2 (type float64) as type float32 in assignment必须使用这样的强制类型转换才可以:
floatValue1 = float32(floatValue2)在实际开发中,应该尽可能地使用 float64 类型,因为 math 包中所有有关数学运算的函数都会要求接收这个类型。
浮点数的精度
浮点数不是一种精确的表达方式,因为二进制无法精确表示所有十进制小数,比如 0.1、0.7 这种,下面我们通过一个示例来给大家直观演示下:
floatValue4 := 0.1
floatValue5 := 0.7
floatValue6 := floatValue4 + floatValue5注:浮点数的运算和整型一样,也要保证操作数的类型一致,
float32和float64类型数据不能混合运算,需要手动进行强制转化才可以,这一点和动态语言不同。
你觉得上面计算结果 floatValue6 的值是多少?0.8?不,它的结果是 0.7999999999999999,这是因为计算机底层将十进制的 0.1 和 0.7 转化为二进制表示时,会丢失精度,所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。
浮点数的比较
浮点数支持通过算术运算符进行四则运算,也支持通过比较运算符进行比较(前提是运算符两边的操作数类型一致),但是涉及到相等的比较除外,因为我们上面提到,看起来相等的两个十进制浮点数,在底层转化为二进制时会丢失精度,因此不能被表象蒙蔽。
如果一定要判断相等,下面是一种替代的解决方案:
p := 0.00001
// 判断 floatValue1 与 floatValue2 是否相等
if math.Dim(float64(floatValue1), floatValue2) < p {
fmt.Println("floatValue1 和 floatValue2 相等")
} 可以看到,我们的解决方案是一种近似判断,通过一个可以接受的最小误差值 p,约定如果两个浮点数的差值在此精度的误差范围之内,则判定这两个浮点数相等。这个解决方案也是其他语言判断浮点数相等所采用的通用方案。
复数类型
除了整型和浮点型之外,Go 语言还支持复数类型,与复数相对,我们可以把整型和浮点型这种日常比较常见的数字称为实数,复数是实数的延伸,可以通过两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示虚部(imag),常见的表达形式如下:
z = a + bi其中 a、b 均为实数,i 称为虚数单位,当 b = 0 时,z 就是常见的实数,当 a = 0 而 b ≠ 0 时,将 z 称之为纯虚数,如果你理解数学概念中的复数概念,这些都很好理解,下面我们来看下复数在 Go 语言中的表示和使用。
在 Go 语言中,复数支持两种类型:complex64(32 位实部和虚部) 和 complex128(64 位实部与虚部),对应的表示示例如下,和数学概念中的复数表示形式一致:
var complexValue1 complex64
complexValue1 = 1.10 + 10i // 由两个 float32 实数构成的复数类型
complexValue2 := 1.10 + 10i // 和浮点型一样,默认自动推导的实数类型是 float64,所以 complexValue2 是 complex128 类型
complexValue3 := complex(1.10, 10) // 与 complexValue2 等价对于一个复数 z = complex(x, y),就可以通过 Go 语言内置函数 real(z) 获得该复数的实部,也就是 x,通过 imag(z) 获得该复数的虚部,也就是 y。
复数支持和其它数字类型一样的算术运算符。当你使用 == 或者 != 对复数进行比较运算时,由于构成复数的实数部分也是浮点型,需要注意对精度的把握。
边栏推荐
- What is the best and safest software to download when buying stocks?
- Is it safe to buy stocks and open an account through the account opening link of the broker manager? Want to open an account for stock trading
- WebSocket(简单体验版)
- 国泰君安证券靠谱吗?开证券账户安全吗?
- 2022电工(初级)复训题库及在线模拟考试
- ETCD数据库源码分析——集群间网络层服务端RaftHandler
- Custom controls under WPF and adaption of controls in Grid
- crond BAD FILE MODE /etc/cron. d
- Notepad++--常用的插件
- 《Go题库·12》slice和array区别?
猜你喜欢

Tencent games released more than 40 products and projects, including 12 new games

Win 10出现bitlocke恢复,蓝屏错误代码0x1600007e

Flow based depth generation model

s32ds跳转到DefaultISR

ETCD数据库源码分析——集群间网络层服务端RaftHandler

基于 LNMP 搭建个人网站的填坑之旅

如何编写简洁代码?(上)

荣耀v8 真机调试时不显示 Logcat 日志的解决办法

劲爆!YOLOv6又快又准的目标检测框架开源啦(附源代码下载)

導入Excel文件,解决跳過空白單元格不讀取,並且下標前移的問題,以及RETURN_BLANK_AS_NULL報紅
随机推荐
Tardigrade: Trino's solution to ETL scenarios
導入Excel文件,解决跳過空白單元格不讀取,並且下標前移的問題,以及RETURN_BLANK_AS_NULL報紅
可扩展存储系统(上)
2022电工(初级)复训题库及在线模拟考试
The same is MB. Why is the gap so large?
《Go题库·12》slice和array区别?
17 `bs对象.节点名h3.parent` parents 获取父节点 祖先节点
第二轮红队免费公开课来袭~明晚八点!
INFO:&nbsp;HHH000397:&nbsp;Using…
Ten years' experience of Software Engineer
Is it safe to buy stocks and open an account through the account opening link of the broker manager? Want to open an account for stock trading
The first in the industry! MOS sub evaluation model for subjective video quality experience that can run on mobile devices!
可扩展系统的“9不”原则和“5个”衡量维度
用于 C# 的 SQL 基本语法总结
collections. Use of defaultdict()
Packet capturing and sorting out external Fiddler -- understanding the toolbar [1]
空闲中断无法清除
Artifact for converting pcap to JSON file: joy (installation)
爱普生L3153打印机如何清洗喷头
nn.Parameter和torch.nn.init系列函数给模型参数初始化