Я работаю над программой, которая производит ассемблерный код из выражений. Одной из требуемых функций является 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;
}