生成表格式数据是能够从循环机制受益的事情之一。举个例子,在计算机成为常用设备之前,人们必须手工计算对数、正余弦以及其他常用的数学函数。为使这类工作更简单,产生了一些书,包含了一些长表格,你可以查出不同函数的值。创建这些表的工作是缓慢而繁琐的,而且结果容易大量出错。
当计算机登上了历史舞台,人们最初的反应是:“太棒了!我们可以用计算机准确无误的生成这些表。”这是个(大部分)正确但短视的看法。没多久,计算机和计算器普及,数学表就过时了。
好吧,应该说基本上过时了。事实上对于某些运算,计算机使用数学表得到一个近似的答案,然后执行计算去改进这个近似解。有些情况下,计算机背后的数学表是有误差的,最著名的就是最初的因特尔奔腾计算浮点除法使用的表。
对数表已经不像以前那么有用了,但它仍然是一个不错的迭代示例。下面这段程序在左边一栏输出一列值,在右边一栏输出其对应的一列对数值:
double x = 1.0;
while (x < 10.0) {
cout << x << "\t" << log(x) << "\n";
x = x + 1.0;
}
字符序列\t表示制表符。字符序列\n表示换行符。这些字符序列可以出现在字符串的任意位置,而在此例中,字符串中只有这类字符序列。
制表符使光标右移至制表结束位置,通常是每8字节制表一次。稍后我们将看到制表符的用途—使多列文本排列整齐。
换行符的作用与endl完全一样,即移动光标到下一行。通常情况,如果换行符单独出现,我就用endl;如果作为字符串的一部分出现,我就用\n。
上面一段程序的输出:
1 0
2 0.693147
3 1.09861
4 1.38629
5 1.60944
6 1.79176
7 1.94591
8 2.07944
9 2.19722
要是看着上面这些数很奇怪,别忘了log函数是以e为底的。计算机科学中2的幂很重要,因此我们常常要计算以2为底的对数,我们可以通过以下公式实现:
输出语句改为:
cout << x << "\t" << log(x) / log(2.0) << endl;
输出:
1 0
2 1
3 1.58496
4 2
5 2.32193
6 2.58496
7 2.80735
8 3
9 3.16993
可以看到,第1、2、4、8行为2的整数次幂。如果想求2的其他整数次幂,我们可以修改程序如下:
double x = 1.0;
while (x < 100.0) {
cout << x << "\t" << log(x) / log(2.0) << endl;
x = x * 2.0;
}
之前的循环中,我们用一个数去加x,输出一个算术序列;现在我们改用一个数去乘x,输出一个几何级序列。输出结果是:
1 0
2 1
4 2
8 3
16 4
32 5
64 6
由于我们在列之间使用的是制表符,所以第二列的位置也就不取决于第一列的数字位数了。
对数表也许不再有用,但对于和2的整数次幂打交道的计算机科学家而言,则是非常有用。下面出一道习题:修改上面这段程序,使之能一直输出到65536(2^16)。把程序打出来并记住它。