• 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

  • 相关阅读:
    第二阶段团队冲刺第五天
    第二阶段冲刺七
    第二阶段冲刺六
    第二阶段冲刺五
    第二阶段冲刺四
    冲刺第二阶段三
    冲刺第二阶段二
    冲刺第二阶段 一
    项目总结
    第二阶段SCRUM
  • 原文地址:https://www.cnblogs.com/findumars/p/9363575.html
Copyright © 2020-2023  润新知