代码之家  ›  专栏  ›  技术社区  ›  jheriko

为什么printf显示FPTAN结果的-1.#IND?

  •  2
  • jheriko  · 技术社区  · 15 年前

    我正在开发一个从表达式生成汇编代码的程序。所需的函数之一是tan(x),它当前使用以下代码序列工作(地址在运行时填写):

    fld [0x00C01288];
    fld st(0);
    fsin;
    fld st(1);
    fcos;
    fdivp;
    fst [0x0030FA8C];
    

    但是,我想使用 FPTAN 操作码,因此我尝试使用以下代码:

    fld [0x00C01288];
    fptan;
    fincstp;
    fst [0x0030FA8C];
    

    测试程序使用printf显示存储在0x30FA8C的结果,但对于第二个序列,结果显示为-1.#IND(第一个使用cos和sin的序列工作正常)。如果我尝试在调试器中检查内存地址处或浮点堆栈顶部的值,它将显示为正确的数字。

    所以,我的问题是:为什么printf显示-1.#IND?我如何修复它?

    两种情况下的结果均为~0.5463024898

    我的第一个想法是,所存储的值是同一个数字的不同表示形式,但检查存储在0x0030FA8C处的值显示,在这两种情况下,它都是0x3FE17B4F5BF3474A。

    我不明白为什么printf函数的相同输入会产生不同的输出。。。

    如有任何帮助或建议,将不胜感激。

    编辑:调用printf的源:

    #include "FridgeScript.h"
    #include <stdio.h>
    #include <math.h>
    
    char test[] = "a=tan(0.5);";
    
    int main(int c, char** s)
    {
        unsigned int SC = FSCreateContext();
    
        double a = 0.0;
        FSRegisterVariable(SC, "a", &a);
    
        unsigned int CH = FSCompile(SC, test);
        if(CH) FSExecute(SC, CH);
    
        printf("a: %.10g\r\n", a);
        printf("hex a: %I64X", a);
    
        FSDestroyContext(SC);
        return 0;
    }
    
    3 回复  |  直到 15 年前
        1
  •  9
  •   Jesse Rusak    15 年前

    让我随便说说:使用

    fstp st(0);
    

    而不是

    fincstp;
    

    fincstp上的文档说,这并不等同于从堆栈中弹出项目,因为它会将该点标记为已填充-也许这会扰乱printf内部的浮点处理?

    (你可能会猜到我不知道我在说什么。但也许这会给你一个想法?)

        2
  •  1
  •   Bastien Léonard    15 年前
    fld [0x00C01288];
    fptan;
    fincstp;
    fst [0x0030FA8C];
    

    在我看来,这段代码执行后,切线仍然在 st0 fstp 而不是 fst

        3
  •  0
  •   Nils Pipenbrinck    15 年前

    我在汇编代码中没有看到任何大小前缀。通常你会看到这样的情况:

      FST [dword ptr some_address]
    
      or 
    
      FS [qword ptr some_address]
    
    推荐文章