【发布时间】:2009-04-13 12:19:11
【问题描述】:
我正在开发一个从表达式生成汇编代码的程序。所需的函数之一是 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;
}
【问题讨论】:
-
你能否展示一下使用 printf 函数的源代码?
-
还有很多其他的东西……但我还是会添加它。
-
"-1.#IND" 是 printf 表示 NaN 的方式。我没有其他帮助可以添加,但这可能是一些有用的琐事......
标签: c++ assembly floating-point x86