阅读 ‧ 电子书库 浮点数舍入误差
将一个数加上1再减去原数,结果为1。如果使用浮点计算,则可能会有其他结果,如下例所示:
阅读 ‧ 电子书库
输出结果如下:
0.000000 ←older gcc on Linux
-13584010575872.000000 ←Turbo C 1.5
1.5 4008175468544.000000 ←CodeWarrior 9.0, MSVC++ 7.0
出现这种奇怪的结果是由于计算机缺乏足够的进行正确运算所需的十进制位数。数字2.0e20为2后面加20个零,如果对它加1,那么变化的是第21位。如果要正确计算,至少需要存储21位的数字,而float数字只有6、7位有效数字。因此这个计算注定是不正确的。另一方面若使用2.0e4代替2.0e20,则能得到正确的结果,因为改变的是第5位数字,float数字对此足够精确。
3.4.7 复数和虚数类型

很多科学和工程计算需要复数和虚数。C99标准支持这些类型,但是有所保留。一些自由实现中不需要这些类型,比如一些嵌入式处理器的实现(VCR芯片就不需要复数)。同样的,虚数类型也是可选的。

简单地讲,有3种复数类型,分别是float_Complex、double_Complex和long double_Complex。float_Complex变量包含两个float值,一个表示复数的实部,另一个表示复数的虚部。与之类似,有3种虚数类型,分别是float _Imaginary、double _Imaginary和long double _Imaginary。

如果您包含了complex.h头文件,则您可以用complex代替_Complex,用imaginary代替_Imaginary,用符号I表示-1的平方根。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

3.4.8 其他类型

现在已经介绍了所有的基本数据类型。对于有些人,类型可能太多,另一些人可能认为还需要更多的类型。C没有字符串类型,但是它仍然可以很好地处理字符串,详细内容请参见第4章。

C从基本类型中衍生出其他类型,包括数组、指针、结构和联合。尽管我们在后面章节中才会介绍指针类型,本章已经在示例中使用指针(指针(pointer)指向变量或其他数据对象的位置,scanf()函数中就使用&前缀创建一个指向信息存储位置的指针)。