我用的VC2005,使用一个开发包进行开发,发现了如下问题:假设有这样一段代码:double a = 10000.f;
a = a + 0.000001;这样一段代码如果放在InitEngine()之前运行,最后a的结果就是10000.000001,如果放在
InitEngine()之后运行,结果就是10000.000000f。InitEngine()是开发包里面的引擎初始化调
用。请问为什么会产生这样的误差?InitEngine()里面做了什么使得小数后面的精度改变
了?
 

解决方案 »

  1.   

    也许跟INIT没关系,小数在机器里就是不能精确表示。小数点以后那么多位是绝对不能用的,任何比较判断都可能出错,就当那是假的,伪的,骗人的好了。
    如果一定要用,可以把数据放大10000倍,转化成LONG,INT等整数类型,存储的时候用整形,表示的时候用小数。
    比如,深度用234.567米是不精确的,而234567毫米是精确的。存储在文件里一定用毫米,表示在界面上换算成小数。
      

  2.   

    才11位, 精度足够
    以下为变量储存的内存情况
    a:10000.000000
    00000000: 00 00 00 00 00 88 C3 40
    b:10000.000001
    00000000: 7C 63 08 00 00 88 C3 40楼主是用什么方法查看结果的?? 可能方法不准确
      

  3.   

    我就是在Watch里面查看的,并没有跑到Memory里面去看
    关键是这种误差会直接导致我后面比较大小的条件语句出现错误~
    哎,好郁闷啊
    我在使用老版本开发包的时候没有这个问题,使用新版开发包的时候就会出现这个问题
      

  4.   


    我也遇到了这样的问题,请问如何解决呢?
    开始是:float A=10.0e-6;
    float B=A*0.5f
    ...
    但是在Watch里看到的A=9.9999997e-006
    B=4.9999999e-006这样的误差会导致后面的运算和比较大小的条件语句。
    请问如何解决呢?
    由于数量级比较小,其实我只希望A,B能保留小数点后1-2位就行了,既比如A=1.00e-5 B=0.50e-6这样精度就够了。谢谢