c 语言 之 加法出问题

正在学校机房上c语言的实验呢,突然同学问我一个教科书上的例子,其中有一个问题,我一看也不知道怎么办了,先看代码:

[c]

#include “stdio.h”
main()
{
double a = 111111.111, b = 222222.222, c;
c = a + b;
printf(”%f”, c);
}
[/c]

输出的结果是 333333.312500
很奇怪阿…… 可是我把 float 改成 double 之后就好了

后来上网查了一下,发现看来还是浮点数的精度问题:

一个浮点数a由两个数m和e来表示:a = m × be。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd…ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

via

由此可见,上述问题就是精度不够的问题,改成 double 就好了。不明白教科书为什么显示出来了这样的问题,却不说明……

收藏/分享
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • MySpace
  • Pownce
  • StumbleUpon
  • Haohao
  • E-mail this story to a friend!
  • SalesMarks
  • Technorati
  • TwitThis

Comments (4)

echoJune 3rd, 2008 at 9:29 pm

这么专业 - -!

[Reply]

UnrealJune 3rd, 2008 at 9:30 pm

我记得我们老师有说这个问题…我在网上也看到过这个问题…嘿嘿………

[Reply]

柒小诺June 3rd, 2008 at 9:30 pm

什么阿,其实这个问题很basic的……

[Reply]

柒小诺June 3rd, 2008 at 9:31 pm

诡异……我当时就给雷到了。。。
回头好好研究一下这个问题!

[Reply]

Leave a comment

Your comment