zoukankan      html  css  js  c++  java
  • Delphi的时间 x87 fpu control word 精度设置的不够

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

    这个显然是因为该程序的 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 下没错,我很怀疑注入的是否为同一个程序,一般编译器都会对该标志位进行设置

    https://bbs.csdn.net/topics/370045425

  • 相关阅读:
    Codeforces Round #319 (Div. 2) D
    因为网络请求是 异步的,
    ios真蛋疼,
    单例模式的两种实现,
    jump, jump,
    一点 误删,
    关于代理,
    button上的两个手势,
    数据,
    header 的蓝色,
  • 原文地址:https://www.cnblogs.com/findumars/p/9363575.html
Copyright © 2011-2022 走看看