春暖花开
雪化了,花开了,春天来了
posts - 149,comments - 125,trackbacks - 0
http://radovi.javaeye.com/blog/322096这篇博客里谈到计算机计算浮点数时的舍入误差,我也在VS2005下进行了相应的实验,如下代码:

#include <iostream>

using namespace std;

int main()
{
    
double f = 4.35;

    
int a = int(f*100);

    cout 
<< a << endl;

    system(
"pause");
}

 的确打印出来的结果是434.

老男孩给出的解释是这样的:
这个问题和二进制的表示有很大关系
简单地说
计算机不能准确表示诸如1/10等一类分数

我查到了一篇文章:http://support.microsoft.com/kb/214118/zh-cn,如下,
       IEEE 754 标准是一种方法很容易操作的压缩方式存储浮点数。 Intel coprocessors 和实现浮点数学的大多数基于 PC 的程序使用此标准。
       IEEE 754 指定编号,以减少存储要求,并允许该内置二进制算法指令来处理数据以相对较快速的方式的所有微处理器上可用的二进制格式存储。 但是,是简单的、 非重复的十进制数字的某些数字转换为重复不能存储的完美的准确性的二进制数字。
      例如数 1 / 10 可以表示简单小数的十进制数字系统中:
      .1
     但是,二进制格式中的数目将十进制重复的二进制文件:
     0001100011000111000111 (和这样上)
     此数字无法表示按有限数量的空间。 因此,此数字向下舍入的大约-2.78E-17 存储。
      如果获取给定的结果执行多个的算术运算,这些舍入误差可能具有累积性。

      看来是和二进制的表示有很大关系。
posted on 2009-04-15 13:38 Sandy 阅读(2527) 评论(1)  编辑 收藏 引用 所属分类: c++学习

FeedBack:
# re: 计算机计算浮点数时的舍入误差
2009-04-15 17:01 | Smile
double f = 4.35;
double d = f * 1000;
int a = int(d / 10);

cout << a << endl;

就是435了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理