想重新看一篇这本书,因为是英文版,所以想看的过程中把一些东西记录下来。所以就随便翻译了一下。先记录在这里吧。
第一章 真实世界的计算机数字表示
1.1 引言
这章我们将讨论可能是构建3d图形管道最基础的东西:计算机如何表示数字,特别是实数。虽然一些3d程序员经常成功的使用计算机表示(近似)的实数,但是却没有理解是如何实现的,这经常会在应用程序开发过程中引起一些细微的错误和性能问题,一些大学计算机结构方面的书籍给出了整数的表示(比如c或者c++中的整形和无符号整形),但是却只是简单的介绍浮点数和其他非整形数的表示。因为3d数学都是与实数打交道,因此对在这个领域工作的人来说,理解计算机表示的实数的特征和限制就非常重要了。
本章我们将主要讨论实数、浮点数的计算机表示以及二进制位的格式、基本操作以及限制。并从实数的表示过渡到3d相关的主题。本章的大部分内容都是关于IEEE浮点规范,并讨论由于这种表示的限制在你3d管道中造成的问题。并带有一个学习案例。
我们假定读者熟悉整形的一些基本概念。比如通过二的补码表示的有符号数、范围、溢出、一般的存储字节数(8,16或32)。标准的c和c++基础类型转换等。如果不熟悉,请参考相关数据。
1.2 实数表示
对一些开发者来说,实数是3d图形系统的心脏和灵魂。这本书后面的部分就是基于实数或者实数空间。在大多数计算机上面实数的实现是最有弹性和强大的,不要奇怪的是,同时也是最复杂和最容易产生问题的。我们将会讲解今天计算机上表示是熟的方法,还用几节来描述这种表示给应用开发带来的问题。
整数由于存储的原因,带来最臭名昭著的问题就是溢出,但是这个问题在实数里面仍然存在。而且实数的表示带来了更多的复杂性以及由此带来的实现权衡、细微的错误和很难跟踪的性能问题非常容易把程序员搞迷糊。
1.2.1 近似
计算机表示的整数和正整数是全部整数的一个连续的子集。就是说如果i和i+2是可以表示的,那么i+1也是可以表示的。在可被描述的最小值和最大值范围内,所有的值都是可以被正确描述的。这是因为有限范围内的整数包含的元素是有限的。
对实数来而言,上述说法是不在正确了。在有限的最小实数和最大实数范围之间的子集里面的实数是无限多的,无论这个范围有多小(当然要排除最小值等于最大值的情况)。因此我们不能完全正确描述一个实数的子集。因此我们在讨论实数表现的时候主要也是讨论范围和精度的相关的问题。为了理解实数的表示,我们首先要了解精度和误差的概念。