Проблема с FLD

Тема в разделе "WASM.BEGINNERS", создана пользователем prog, 14 сен 2006.

  1. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Странная штука..

    a_ dq 1.448888739433602496d

    fld qword ptr [a_]

    смотрю в SoftIce - в st(0) ложится
    1.448888739433602524

    или компилятор переделывает
    1.448888739433602496
    в
    1.448888739433602524
    ???
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Вопрос с бородой ;)
    В формате dq = double всего 53 бита мантиссы (включая старший бит по умолчанию), что соответсвует 15-16 десятичным знакам, а ты аж 19 замутил :lol:
    Вот у тебя до 16-го знака и совпадает, а дальше - извини, битов не хватило ;)
     
  3. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Ну... тогда я вообще запутался... :dntknw:

    Мне надо вычислить это-

    res = с3*a - c2*b + c1*c - c0*d;

    после последнего действия ("- c0*d") результат в программе на си- один, у меня - другой.


    делаю так:

    Код (Text):
    1. DWORD PTR и QWORD PTR  - тут ошибок нет.
    2.  
    3.     fld DWORD PTR [a]  
    4.     fmul QWORD PTR [c3] ;c3*a
    5.  
    6.     fld DWORD PTR [b]  
    7.     fmul QWORD PTR [c2]
    8.     fsubp st(1),st(0)   ;с3*a - c2*b
    9.  
    10.     fld DWORD PTR [c]  
    11.     fmul QWORD PTR [c1]
    12.     faddp st(1),st(0)   ;с3*a - c2*b + c1*c
    13.  
    14.     ;для проверки ниже отдельно сохраняем (с3*a - c2*b + c1*c)
    15.     fst qword ptr [tmp1_]
    16.  
    17.  
    18.     fld DWORD PTR [d]  
    19.     fmul QWORD PTR [C0] ;c0*d
    20.  
    21.     ;для проверки ниже отдельно сохраняем (c0*d)
    22.     fst qword ptr [tmp2_]
    23.  
    24.     ;вот тут результат- отличный от результата на си
    25.     fsubp st(1),st(0)   ;с3*a - c2*b + c1*c - c0*d
    26.  
    27.     ;!!! ЭТО НЕ СОВПАДАЕТ С РЕЗУЛЬТАТОМ В СИ !!!
    28.     fst qword ptr [tmp3_]   ;тут res= 3C AC 00 00 00 00 00 00
    29.  
    30.  
    31.  
    32.     ;---- теперь проверяем:
    33.     ;сохраненное в qword (с3*a - c2*b + c1*c) - сохраненное в qword (c0*d)
    34.  
    35.  
    36.     fld qword ptr [tmp1_]   ;берем сохраненное в qword (с3*a - c2*b + c1*c)
    37.     fsub qword ptr [tmp2_]  ;(с3*a - c2*b + c1*c)- сохраненное в qword (c0*d)
    38.  
    39.     ;!!! ЭТО СОВПАДАЕТ С РЕЗУЛЬТАТОМ В СИ !!!
    40.     fstp qword ptr [tmp3_]  ;тут res= 3C B0 00 00 00 00 00 00
    41.  
    42.     ;
    т.е., говоря короче, если операнды последнего действия ("- c0*d") берутся из стэка, то результат-

    3C AC 00 00 00 00 00 00 (это- уже перевернутое значение, в памяти лежит все наоборот)

    (ОТЛИЧНЫЙ от результата на си), а если оба эти операнда сначала записать в qword, а потом взять оттуда и произвести вычитание- то результат-

    3C B0 00 00 00 00 00 00 (это- уже перевернутое значение, в памяти лежит все наоборот)

    -такой же, как в программе на си (и это - ПРАВИЛЬНЫЙ результат.)

    Может это из-за того, что в стеке все считается в 80 битном виде, а когда я записываю в qword, значения из стека записываются откругленными?

    Если так, то тогда вопрос- как вычесть, не используя запись во временные переменные, а вычитая значения в стеке, чтобы результат был таким же, как и в си?
    и самое интересное- скомпилировал программу на си с генерацией асм листинга, так там- тот же самый код, что и у меня (без использования tmp_ переменных, все вычисления- со стеком). И все , все- то же самое.. Все константы объявлены так же, все то же самое.
    И это- самое жуткое.
    У меня голова уже дымится...
    Может, опции компилятора?... почему???
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Открыл Америку ;) Ты об FPU Control Word и битах PC (precision control) слышал ? Так вот у тебя по умолчанию установлена максимальная точность extended PC = 11b, а в сях используется точность double PC = 10b и при каждом fmul результат округляется до double. Для ликбеза почитай IA-32, v.1, а также см. инструкции FSTCW и FLDCW
     
  5. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Не слышал!
    Круто!
    Огромное Спасибо за информацию!
    :)
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    prog
    Стоит ли подражать C?
     
  7. prog

    prog New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2003
    Сообщения:
    62
    Адрес:
    Russia
    Quantum,
    Есть работающий алгоритм на си, обрабатывающий данные, мне нужно переписать его на асм.
    Поэтому и надо, чтобы было как в си.
    Благодаря помощи уже сделал.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    prog
    Зато на асме (с настройками CW по умолчанию) точность выше.