加载中...

6.4 制表


生成表格式数据是能够从循环机制受益的事情之一。举个例子,在计算机成为常用设备之前,人们必须手工计算对数、正余弦以及其他常用的数学函数。为使这类工作更简单,产生了一些书,包含了一些长表格,你可以查出不同函数的值。创建这些表的工作是缓慢而繁琐的,而且结果容易大量出错。

当计算机登上了历史舞台,人们最初的反应是:“太棒了!我们可以用计算机准确无误的生成这些表。”这是个(大部分)正确但短视的看法。没多久,计算机和计算器普及,数学表就过时了。

好吧,应该说基本上过时了。事实上对于某些运算,计算机使用数学表得到一个近似的答案,然后执行计算去改进这个近似解。有些情况下,计算机背后的数学表是有误差的,最著名的就是最初的因特尔奔腾计算浮点除法使用的表。

对数表已经不像以前那么有用了,但它仍然是一个不错的迭代示例。下面这段程序在左边一栏输出一列值,在右边一栏输出其对应的一列对数值:

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)。把程序打出来并记住它。 

还没有评论.