Почему printf показывает -1. # IND для результатов FPTAN? - PullRequest
2 голосов
/ 13 апреля 2009

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

Ответы [ 3 ]

9 голосов
/ 13 апреля 2009

Позвольте мне просто кое-что добавить: как насчет использования

fstp st(0);

вместо

fincstp;

В документации по fincstp сказано, что это не эквивалентно вытаскиванию элемента из стека, потому что оставляет пятно помеченным как заполненное - возможно, это портит обработку float внутри printf?

(Вы можете догадаться, что я не знаю, о чем говорю. Но, может быть, это даст вам идею?)

1 голос
/ 13 апреля 2009
fld [0x00C01288];
fptan;
fincstp;
fst [0x0030FA8C];

Мне кажется, что после выполнения этого кода тангенс все еще равен st0. Разве вы не должны использовать fstp вместо fst?

0 голосов
/ 13 апреля 2009

Может быть, ваша инструкция FST хранит только результат с плавающей точкой, а второе слово все еще не инициализировано?

Я не вижу префикса размера в коде сборки. Обычно вы видите что-то вроде:

  FST [dword ptr some_address]

  or 

  FS [qword ptr some_address]
...