在win7 64位系统下,  一个DELPHI写的DLL注入一个C语言程序后. 出现非常奇怪的浮点数相加出错的情况. (注: 在XP系统下是正常的).比如: 40725.0001597563 + 0.72490458022  (两个数值均为Double类型).正确答案是: 40725.72506433652但是.....  在注入的DLL里面计算的结果是: 40725.7251502359
请大家帮我看看, 产生错误结果的可能原因是什么?   非常感谢!=============
提供我的试验代码:Memo1.Lines.Add(FloatToStr(40725.0001597563 + 0.72490458022));

解决方案 »

  1.   

    楼上的回答不对哦.  这个是计算时间的.  你看结果相关也太大了吧. 呵呵.附上OD跟踪结果:写一个简单的exe文件, 用OD跟踪计算过程MOV DWORD PTR SS:[EBP-8],14F0883         ;
    MOV DWORD PTR SS:[EBP-4],40E3E2A0        ;
    MOV DWORD PTR SS:[EBP-10],17187F0C       ;
    MOV DWORD PTR SS:[EBP-C],3FE7326B        ;
    FLD QWORD PTR SS:[EBP-8]                 ;  入栈: 40725.00015975630
    FADD QWORD PTR SS:[EBP-10]               ;  + 0.72490458022
    FSTP QWORD PTR SS:[EBP-18]               ;  结果出栈: 40725.725064336522310跟踪DLL注入目标进程后的计算过程.MOV DWORD PTR SS:[EBP-8],14F0883         ;  
    MOV DWORD PTR SS:[EBP-4],40E3E2A0        ;
    MOV DWORD PTR SS:[EBP-10],17187F0C       ;
    MOV DWORD PTR SS:[EBP-C],3FE7326B        ;
    FLD QWORD PTR SS:[EBP-8]                 ;  入栈: 40725.00015975630
    FADD QWORD PTR SS:[EBP-10]               ;  + 0.72490458022
    FSTP QWORD PTR SS:[EBP-18]               ;  结果出栈: 40725.726562500000000
      

  2.   


    绝对没有的.  本来我是用 now 函数取时间, 发现无论mouse点几次, 时间都是不变的...后来深入看了一下.  发现根本原因是浮点数计算有点乱来..
    function Now: TDateTime;
    {$IFDEF MSWINDOWS}
    var
      SystemTime: TSystemTime;
    begin
      GetLocalTime(SystemTime);
      with SystemTime do
        Result := EncodeDate(wYear, wMonth, wDay) +
          EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
    end;
    {$ENDIF}
    上面函数的 encodedate 与 encodetime 结果都正确,  但是 result 的结果是错误的.后面我就用两个double相加做试验. 果然结果不对.
      

  3.   

    delphi的 浮点运算有些问题。。
      

  4.   

    这个显然是因为该程序的 x87 fpu control word 精度设置的不够,只支持单精度浮点运算的结果。可以用 delphi rtl 自带的 Get8087CW/Set8087CW 取得/设置该16位值。在该线程中取得 x87 cw 的值,用16位形式表示成 0xABCD,该线程的 B 应该为0,把该位设置为2或3即可(delphi 默认为3,用来支持80位的 Extended 类型)。到 intel 手册 basic 卷里找 x87 fpu 章里的说明,看看就明白了。至于你说在 xp 下没错,我很怀疑注入的是否为同一个程序,一般编译器都会对该标志位进行设置