jhe*_*iko 2 c++ floating-point x86 assembly
我正在研究一个从表达式生成汇编代码的程序.所需的功能之一是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,我该如何解决?
0x00C01288的值为双精度0.5.两种情况下的结果均为~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;
}
让我抛出一些东西:如何使用
fstp st(0);
代替
fincstp;
fincstp上的文档说它不等于从堆栈中弹出项目,因为它将该标记标记为已填充 - 也许这会弄乱printf中的浮点处理?
(你或许可以猜到我不知道我在说什么.但也许这会给你一个想法?)
| 归档时间: | 
 | 
| 查看次数: | 1137 次 | 
| 最近记录: |