Golang 入门 : 浮点数
浮点数介绍
Go语言提供了两种精度的浮点数:float32 和 float64。它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持。
这些浮点数类型的范围可以从很微小到很巨大。浮点数的范围极限值可以在 math 包找到,常量 math.MaxFloat32 表示 float32 能表示的最大数值;对应的 math.MaxFloat64 表示 float64 能表示的最大数值。
| 单精度 浮点类型 | 取值范围 | |
|---|---|---|
| float32 | 负数时 | -3.402823E38 到 -1.401298E-45 | 
| float32 | 正数时 | 1.401298E-45 到 3.402823E38 | 
| 双精度 浮点类型 | 取值范围 | 
|---|---|
| float64 | -1.79E+308 到 +1.79E+308 | 
1.79E-308 是 1.79 乘以 10的负308次方。 1.79E+308 是 1.79 乘以 10的308次方。
math 包中除了提供大量常用的数学函数外,还提供了IEEE754浮点数标准中定义的特殊值的创建和测试:正无穷大和负无穷大,分别用于表示太大溢出的数字和除零的结果;还有 NaN 非数,一般用于表示无效的除法操作结果0/0或Sqrt(-1).
var z float64
fmt.Println(z, -z, 1/z, -1/z, z/z) // "0 -0 +Inf -Inf NaN"
函数 math.IsNaN 用于测试一个数是否是非数 NaN,math.NaN 则返回非数对应的值。虽然可以用 math.NaN 来表示一个非法的结果,但是测试一个结果是否是非数NaN则是充满风险的,因为NaN和任何数都是不相等的。
在浮点数中,NaN、正无穷大和负无穷大都不是唯一 的,每个都有非常多种的 bit 模式表示:
nan := math.NaN()
fmt.Println(nan == nan, nan < nan, nan > nan)  // "false false false"
如果一个函数返回的浮点数结果可能失败,最好的做法是用单独的标志报告失败,像这样:
func compute() (value float64, ok bool) {
	// ...
	if failed {
		return 0, false
	}
	return result, true
}
一个 float32 类型的浮点数可以提供大约 6 个十进制数的精度,而 float64 则可以提供约 15 个十进制数的精度;通常应该优先使用 float64 类型,因为 float32 类型的累计计算误差很容易扩散,并且 float32 能精确表示的正整数并不是很大。
单精度双精度两者区别
在内存中占有的字节数不同
- 单精度浮点数在机内占4个字节。
 - 双精度浮点数在机内占8个字节。
 
有效数字位数不同
- 单精度浮点数 有效数字7位。
 - 双精度浮点数 有效数字16位。
 
使用情况区别
- 一般用来表示美元和分的时候用单精度类型。
 - 超出人类经验的数字函数,例如 sin() cos() tan() sqrt() 都使用双精度值。
 
浮点数类型值的字面量形式
一个浮点数的完整字面量形式包含一个十进制整数部分、一个小数点、一个十进制小数部分和一个整数指数部分。常常地,某些部分可以根据情况省略掉。
1.23
01.23 // == 1.23
.23
1.
// 一个e或者E随后的数值是指数值(底数为10)。
// 指数值必须为一个可以带符号的十进制整数字面量。
1.23e2  // == 123.0
123E2   // == 12300.0
123.E+2 // == 12300.0
1e-1    // == 0.1
.1e0    // == 0.1
0010e-2 // == 0.1
0e+5    // == 0.0
从Go 1.13开始,Go也支持另一种浮点数字面量形式(权称为十六进制浮点数文字表示)。 在一个十六进制浮点数文字表示中,
- 和整数的十六进制文字表示一样,浮点数的十六进制文字表示也必须使用 
0x或者0X开头。 - 和整数的十六进制文字表示不同的是,字母 
p或者P可以出现在浮点数的十六进制文字表示中,其后跟随着一个幂指数(底数为2)。 - 另外要注意,
e和E不能出现在浮点数的十六进制文字表示中。
一些合法的浮点数的十六进制文字表示例子(yPn表示y乘以2^n的意思,而yP-n表示y除以2^n的意思): 
0x1p-2     // == 0.25
0x2.p10    // == 2048.0
0x1.Fp+0   // == 1.9375
0X.8p-0    // == 0.5
0X1FFFP-16 // == 0.1249847412109375
而下面这几个均是不合法的浮点数的十六进制文字表示。
0x.p1    // 整数部分表示必须包含至少一个数字
1p-2     // p指数形式只能出现在浮点数的十六进制文字表示中
0x1.5e-2 // e和E不能出现在浮点数的十六进制文字表示中
浮点类型的零值的标准字面量形式为 0.0。 当然其它很多形式也是合法的,比如0.、.0、0e0 和 0x0p0 等。
Golang 入门 : 浮点数的更多相关文章
- Java程序员的Golang入门指南(上)
		
Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如 ...
 - Java程序员的Golang入门指南(下)
		
Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...
 - Golang 入门 : 竞争条件
		
笔者在前文<Golang 入门 : 理解并发与并行>和<Golang 入门 : goroutine(协程)>中介绍了 Golang 对并发的原生支持以及 goroutine 的 ...
 - Golang 入门 : goroutine(协程)
		
在操作系统中,执行体是个抽象的概念.与之对应的实体有进程.线程以及协程(coroutine).协程也叫轻量级的线程,与传统的进程和线程相比,协程的最大特点是 "轻"!可以轻松创建上 ...
 - Golang 入门 : channel(通道)
		
笔者在<Golang 入门 : 竞争条件>一文中介绍了 Golang 并发编程中需要面对的竞争条件.本文我们就介绍如何使用 Golang 提供的 channel(通道) 消除竞争条件. C ...
 - 推荐一个GOLANG入门很好的网址
		
推荐一个GOLANG入门很好的网址,栗子很全 https://books.studygolang.com/gobyexample/
 - Golang入门(4):并发
		
摘要 并发程序指同时进行多个任务的程序,随着硬件的发展,并发程序变得越来越重要.Web服务器会一次处理成千上万的请求,这也是并发的必要性之一.Golang的并发控制比起Java来说,简单了不少.在Go ...
 - Golang入门(3):一天学完GO的进阶语法
		
摘要 在上一篇文章中,我们聊了聊Golang中的一些基础的语法,如变量的定义.条件语句.循环语句等等.他们和其他语言很相似,我们只需要看一看它们之间的区别,就差不多可以掌握了,所以作者称它们为&quo ...
 - Golang入门(2):一天学完GO的基本语法
		
摘要 在配置好环境之后,要研究的就是这个语言的语法了.在这篇文章中,作者希望可以简单的介绍一下Golang的各种语法,并与C和Java作一些简单的对比以加深记忆.因为这篇文章只是入门Golang的第二 ...
 - Golang入门(1):安装与配置环境变量的意义
		
摘要 在几年前学习Java的时候,环境的配置就会劝退一部分的初学者.而对于Golang来说,也需要从环境的配置开始学起.这一篇文章将从如何安装Golang开始讲起,随后将会提到Golang中的环境变量 ...
 
随机推荐
- 综述😋Security and Privacy Challenges of ✌Large Language Models A Survey
 - DVWA靶场Brute Force (暴力破解) 漏洞low(低),medium(中等),high(高),impossible(不可能的)所有级别通关教程及代码审计
			
暴力破解 暴力破解是一种尝试通过穷尽所有可能的选项来获取密码.密钥或其他安全凭证的攻击方法.它是一种简单但通常无效率的破解技术,适用于密码强度较弱的环境或当攻击者没有其他信息可供利用时.暴力破解的基本 ...
 - 理解IM消息“可靠性”和“一致性”问题,以及解决方案探讨
			
本文作者"商文默",本次有修订和改动. 1.写在前面 即时通讯网整理的大量IM技术文章中(见本文末"参考资料"一节),有关消息可靠性和一致性问题的文章占了很大比 ...
 - vue3.0实现炫酷的随机验证码功能
			
先上图 接下来楼一眼实现代码 这里说明一下,我用到了vue3.0,vant3.0以及阿里图标,vant 很人性化针对vue3.0新出了个vant3.0版本,阿里则是适配vue3.0的.我们将verif ...
 - [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(03):图像的导入、显示、调整(暨image部件的使用介绍)
			
前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发. iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动. 本合集是基于新版本的关于分 ...
 - WPF 怎么利用behavior优雅的给一个Datagrid添加一个全选的功能
			
前言:我在迁移旧项目代码的时候发现别人写很多界面都涉及到一个DataGrid的全选,但是每个都写的很混乱,现在刚好空闲下来,写一个博客, 给部分可能不太会写这个的同学讲一下,怎么实现全选功能,并且可以 ...
 - wpf ScrollViewer 滚动动画
			
wpf ScrollViewer 滚动动画: <Window x:Class="WpfTest.FloatTextWindow" xmlns="http://sch ...
 - 第五章 ReentrantLock源码解析
			
最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final Reentrant ...
 - Golang-文件处理11
			
http://c.biancheng.net/golang/102/ Go语言自定义数据文件 对一个程序非常普遍的需求包括维护内部数据结构,为数据交换提供导入导出功能,也支持使用外部工具来处理数据.由 ...
 - HTTP劫持
			
HTTP劫持 想了解什么是HTTPS,要先知道什么是HTTP HTTP HTTP是一个基于TCP/IP通信协议来传递数据的协议,传输的数据类型为HTML文件,图片文件,查询结果等,一般基于B/S架构, ...