· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Вещественные числа

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Июл 16, 2003 16:21:11

По скорости должен быть выйгрышь!! Но правильность написания нужно соблюдать!!!


Дата: Июл 16, 2003 16:55:24

Как сделать чтобы результат был одинаковым на С и на Асме?


Посмотри, что у сишной программы в FPU control word перед началом вычислений. И поставь у себя то же самое.

Или в сишной программе перед самыми вычислениями вставь FNINIT.

А вообще, грабли старые. Особенно обидно, когда очень точно подберёшь какой-нибудь коэффициент на си, а на асме оно необъяснимо глючит...


Дата: Июл 16, 2003 16:58:17

А вообще, грабли старые. Особенно обидно, когда очень точно подберёшь какой-нибудь коэффициент на си, а на асме оно необъяснимо глючит...
Это вы про что?


Дата: Июл 16, 2003 17:07:23

FPU control word [i][/i]
Жто ты имеешь в виду биты которые отвечают за округление???? Я правильно понял?


Дата: Июл 17, 2003 04:07:45

emergenter
технически как это сделать
Если округление, то C++ round?!


Дата: Июл 17, 2003 14:51:40

2 Edmond:
Дело в том, что сишный рантайм (во всяком случае, у нескольких компиляторов) инициализирует арифметический сопроцессор заданными значениями, а не дефолтными, как это обычно делают в программах на ассемблере.

К примеру, Ватком использует следующие значения:
Infinity Control - affine,
Rounding Control - near,
Precision Control - 53 bits,
Interrupt Exception Masks - invalid | denormal | zero divide | overflow | underflow | inexact result.

В результате этого наблюдается различие в результатах одинаковых вычислений, вплоть до одной и той же сишной программы и выдранного из неё же куска кода.

Поскольку различия касаются в основном точности и округления, разница, как правило, бывает невелика и в подавляющем большинстве применений незаметна. Исключение составляют тщательно подобранные коэффициенты, которые зачастую, чтобы не переделывать всё остальное, приходится подбирать заново. Одним из методов борьбы с этим можно считать временную установку в FPU control word значения, соответствующего применяемому используемым компилятором.

2 emergenter :
Я имею в виду все биты, кроме, пожалуй, Exception Masks.
Проще уж действительно все. ;)


Дата: Июл 17, 2003 16:31:15

bsl_zcs
Ясно. Я как раз недавно прочитал об этом. :)


Дата: Июл 17, 2003 16:33:26

Встречный вопрос.
У меня давняя проблема.
Что вы знаете об алгоритме перевода 80-bits числа из строки и обратно в майкрософтовских прогах. Например тот же MASM


Дата: Июл 31, 2003 17:38:12

Блин!! И что делать с этой точностью !! Все доки облазил!!! А вот должно же как то делаться! Код на Си не просто так же делает эту точность!!!
??? Кто нибудь вообще работал с вещественными числами?


Дата: Июл 31, 2003 18:37:07

Ну чего тебе непонятно?

Поставь в сишной программе перед вычислениями
__asm { fninit }
или как там у твоего компилятора это делается...

А вообще, не доки надо смотреть, а исходники rtl. Чего там в доках-то описывать?


Дата: Июл 31, 2003 19:28:10

тут не то!!! А откуда ты знаешь что компилятор использует именно СОПРОЦЕССОР для обработки вещественных чисел!!!!
Я проанализировал и после многочисленных часов добился того что!!!
Допустим есть в массиве float 4 числа (вещественные) например:
1)14.62
2)90.239998
3)171.820007
4)256.639984
ну и получается после сложания каким то боком 533.320007
Я помучался и обнаружил!!!
что когда я засылаю в 4 регистра xmm1, xmm2, xmm3, xmm4 по одному числу в младшия 32 бита а потом все складываю поочередно получается именно такое число 533.320007. А когда использую цикл где числа поочередно звписываются в один регистр xmm и складываются к другому регистру xmm2 то получается 533.319946!!! Что очень странно!! Но нужно именно 1 число!!!! Также дела обстоят и с сопроцессором если в цикле то 533.319946 а если загрузить поочередно в стек сопроцессора а потом сложить в st0 то первое число 533.320007. Блин!! Что делать!! Нужно число 533.320007 а хочется с циклом работать!! И вообще что тут происходит! Кто мне объяснит!!!


Дата: Июл 31, 2003 19:29:59

Пробывал даже подгружать регистр состояния/управления MXCSR!! Не помогло!! Хотя бы были какие нибудь биты которые могли эту картину исправить!! Вот ничего и нет кроме округления!!!

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.060