Go程序设计语言3.2 浮点数

3.2 浮点数


Go具有两种大小的浮点数float32和float64。其算术特性遵从IEEE 754标准,所有新式CPU都支持该标准。

这两个类型的值可从极细微到超宏大。math包给出了浮点值的极限。常量math.MaxFloat32是float32的最大值,大约为3.4e38,而math.MaxFloat64则大约为1.8e308。相应地,最小的正浮点值大约为1.4e-45和4.9e-324。

十进制下,float32的有效数字大约是6位,float64的有效数字大约是15位。绝大多数情况下,应优先选用float64,因为除非格外小心,否则float32的运算会迅速累积误差。另外,float32能精确表示的正整数范围有限:

 

在源码中,浮点数可写成小数,如:

 

小数点前的数字可以省略(.707),后面的也可省去(1.)。非常小或非常大的数字最好使用科学记数法表示,此方法在数量级指数前写字母e或E:

 

浮点值能方便地通过Printf的谓词%g输出,该谓词会自动保持足够的精度,并选择最简洁的表示方式,但是对于数据表,%e(有指数)或%f(无指数)的形式可能更合适。这三个谓词都能掌控输出宽度和数值精度。

 

上面的代码按8个字符的宽度输出自然对数e的各个幂方,结果保留三位小数:

 

除了大量常见的数学函数之外,math包还有函数用于创建和判断IEEE 754标准定义的特殊值:正无穷大和负无穷大,它表示超出最大许可值的数及除以零的商;以及NaN(Not a Number),它表示数学上无意义的运算结果(如0/0或Sqrt(-1))。

 

math.IsNaN函数判断其参数是否是非数值,math.NaN函数则返回非数值(NaN)。在数字运算中,我们倾向于将NaN当作信号值(sentinel value),但直接判断具体的计算结果是否为NaN可能导致潜在错误,因为与NaN的比较总不成立(除了!=,它总是与==相反):

 

一个函数的返回值是浮点型且它有可能出错,那么最好单独报错,如下:

 

下一个程序以浮点绘图运算为例。它根据传入两个参数的函数z=f(x,y),绘出三维的网线状曲面,绘制过程中运用了可缩放矢量图形(Scalable Vector Graphics,SVG),绘制线条的一种标准XML格式。图3-1是函数sin(r)/r的图形输出样例,其中r为sqrt(x*x+y*y)。

 

图3-1 函数sin(r)/r的图形输出样例

 

注意,corner函数返回两个值,构成网格单元其中一角的坐标。

理解这段程序只需基本的几何知识,但略过也无妨,因为本例旨在说明浮点运算。这段程序本质上是三套不同坐标系的相互映射,见图3-2。首先是个包含100×100个单元的二维网格,每个网格单元用整数坐标(i, j)标记,从最远处靠后的角落(0, 0)开始。我们从后向前绘制,因而后方的多边形可能被前方的遮住。

 

图3-2 三套不同坐标系

第二个坐标系内,网格由三维浮点数(x, y, z)决定,其中x和y由i和j的线性函数决定,经过坐标转换,原点处于中央,并且坐标系按照xyrange进行缩放。高度值z由曲面函数f(x, y)决定。

第三个坐标系是二维成像绘图平面(image canvas),原点在左上角。这个平面中点的坐标记作(sx, sy)。我们用等角投影(isometric projection)将三维坐标点(x, y, z)映射到二维绘图平面上。若一个点的x值越大,y值越小,则其在绘图平面上看起来就越接近右方。而若一个点的x值或y值越大,且z值越小,则其在绘图平面上看起来就越接近下方。纵向(x)与横向(y)的缩放系数是由30°角的正弦值和余弦值推导而得。z方向的缩放系数为0.4,是个随意选定的参数值。

二维网格中的单元由main函数处理,它算出多边形ABCD在绘图平面上四个顶点的坐标,其中B对应(i, j),A、C、D则为其他三个顶点,然后再输出一条SVG指令将其绘出。

练习3.1:假如函数f返回一个float64型的无穷大值,就会导致SVG文件含有无效的<polygon>元素(尽管很多SVG绘图程序对此处理得当)。修改本程序以避免无效多边形。

练习3.2:用math包的其他函数试验可视化效果。你能否生成各种曲面,分别呈鸡蛋盒状、雪坡状或马鞍状?

练习3.3:按高度给每个多边形上色,使得峰顶呈红色(#ff0000),谷底呈蓝色(#0000ff)。

练习3.4:仿照1.7节的示例Lissajous的方法,构建一个Web服务器,计算并生成曲面,同时将SVG数据写入客户端。服务器必须如下设置Content-Type报头。

 

(在Lissajous示例中,这一步并不强制要求,因为该服务器使用标准的启发式规则,根据响应内容最前面的512字节来识别常见的格式(如PNG),并生成正确的HTTP报头。)允许客户端通过HTTP请求参数的形式指定各种值,如高度、宽度和颜色。

时间: 2024-12-02 14:08:46

Go程序设计语言3.2 浮点数的相关文章

Go程序设计语言导读

前 言 The Go Programming Language "Go是一种开源的程序设计语言,它意在使得人们能够方便地构建简单.可靠.高效的软件."(来自Go官网golang.org) Go在2007年9月形成构想,并于2009年11月发布,其发明人是Robert Griesemer.Rob Pike和Ken Thompson,这几位都任职于Google.该语言及其配套工具集使得编译和执行既富有表达力又高效,而且使得程序员能够轻松写出可靠.健壮的程序. Go和C从表面上看起来相似,而

【软考教程】程序设计语言基础

继续软考教程的学习,在第1章,我们主要是对计算机的组成和工作原理做了一定了解,可以说,在他的带领下,我们对计算机硬件方面的知识,有了更加坚实的基础. 第2章,程序设计语言基础知识.不看内容,光从标题来看,并不会觉得陌生."程序设计语言",至今,我们已经接触过不止一种了,从最初的VB.到后来的VB.NET.C#.C++,软考前个阶段,我们还见到了早有耳闻的Java世界. 那么,下面就跟随着"设计语言"的脚步,一起发现编程路上美丽的风光吧. 想要对程序设计语言有个宏观上

最受欢迎的十大程序设计语言排行榜更新(10月版)

在最受欢迎的程序设计语言排行榜上最值得关注的是Ruby从一年前的第十三名上升到第十位.无论如何,按照TIOBE程序设计区域指标的数据,这是个神奇的事情.TIOBE程序设计区域指标用于标识程序设计语言的普及度,并根据世界范围的熟练工程师.课程和第三方供应商对程序设计语言的实际使用率,每月更新一次数据. 流行的搜索引擎Google. MSN和Yahoo!都被用于计算此指标的评估结果,根据TIOBE所言.TIOBE在它的网站上发出如下告诫: 注意:TIOBE指标不是为了衡量哪个程设计语言是最好的或者是

c语言编程-这段C程序设计语言书上的代码,运行后按回车只换行并没有输出最长的行,为什么

问题描述 这段C程序设计语言书上的代码,运行后按回车只换行并没有输出最长的行,为什么 #include#define MAXLINE 1000int getline(char line[]int maxline);void copy(char to[]char from[]);main(){int len;int max;char line[MAXLINE];char longest[MAXLINE];max = 0;while ((len = getline(lineMAXLINE))>0)i

《程序分析方法》——1.2 程序设计语言的发展趋势

1.2 程序设计语言的发展趋势 Turbo Pascal编译器的主要编写者以及.NET框架.Delphi和C#之父--Anders Hejlsberg认为,相对于近几十年来计算机硬件的飞速发展,程序语言的改进不是很明显,主要的原因在于人们更关注"工具"."框架"或"开发方法"的变革和创新,而忽略了语言的改进.程序设计离不开程序设计语言,程序设计语言与"工具"."框架"或"开发方法"等一样

Python v3.2发布 面向对象直译式计算机程序设计语言

Python是一种面向对象.直译式计算机程序设计语言,也是一种http://www.aliyun.com/zixun/aggregation/17547.html">功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定.这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行.目前,基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多. 虽然Python可能被粗略地分类为"脚本语言"(script lan

为什么会有这么多种程序设计语言?

传说人类建造通天塔触怒上帝,上帝施法使人类语言混乱彼此之间无法交流.这就是说各种各样的语言其实就是祸乱之源--只会导致交流的不便.可是看看如今的程 序设计语言的数量,你会怀疑人类是否又在造"通天塔"了?真的有这么多语言的必要吗?我到底要学习多少种程序设计语言才够用呢? 根据维基的资料,可以称得上相对"主流"(有人用.有文档)的程序设计语言至少有600种, 还有大量的商业化失败.实用性不高.语言小众(这里的"语言"指的是编码的语言,一般的程序设计语

《Python语言程序设计》——1.3 程序设计语言

1.3 程序设计语言 关键点:计算机程序,又称为软件,是告诉计算机要做什么的指令集. 计算机并不理解人类的语言,所以程序必须用计算机使用的语言来书写.现在有几百种程序设计语言,开发它们对人们来说可以让程序设计过程更加简单.但是,所有的程序必须被转换成计算机能够理解的语言.1.3.1 机器语言 计算机自己的语言(会因计算机的种类不同而有所不同)是它的机器语言--一套内嵌在计算机内的原始指令集.这些指令以二进制代码的形式存在,所以如果给计算机一条用它自己的语言编写的程序,必须输入二进制码的指令.例如

《程序分析方法》——1.1 程序设计语言发展的四个阶段

1.1 程序设计语言发展的四个阶段 到目前为止,程序设计语言的发展经过了机器语言.汇编语言.高级语言.第四代语言四个阶段,每一个阶段都使程序设计的效率大大提高.我们常常把机器语言称为第 一代程序设计语言,把汇编语言称为第二代程序设计语言,把高级语言称为第三代程序设计语言,把最新的程序设计语言称为第四代语言.1.1.1 机器语言 机器语言是计算机能直接识别和执行的一组机器指令的集合.它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能.一条机器指令就是机器语言的一个语句,它是一组有意义的二进

《C语言程序设计》一 1.1 程序和程序设计语言

1.1 程序和程序设计语言 1.1.1 程序与程序设计 程序并不是计算机程序设计中独有的概念,在日常生活中我们也常见到这个词,例如一个会议的日程.一场演出的节目单等,这些程序都是由人的一项项的活动组成的,身处其中时通常需要按部就班地一步步完成一系列动作,有序地完成每一项活动也就实现了程序的目标.可以说,对这种活动过程细节动作的描述就是一个"程序". 日常生活中的程序性活动与计算机里的程序执行类似,这一点有助于我们理解计算机的工作方式.日常生活中的程序性活动里有更多变数,许多事情并不是完