Приветствую, ALL! Вопрос к аудитории: Равнозначны ли по действию, данные инструкции? 1) FADD ST(0), ST(0) 2) FMUL QWORD PTR [fl_2]; Если: fl_2 DQ 2.0 ?
st47k3r Сам-то, как думаешь? И в том и в другом случае происходит удвоение числа Аналогичного результата можно добится если числу в ST(0) "подправить" порядок, т.е. число вида 1.283*2^N изменить на 1.283*2^N+1 смотри здесь
murder: тЭЭкс, а вот это интересно. Спасибо! А как определить на каких величинах он становиться ощутим? Mikl___: ..типа "аналогии" с SHL X, 2?
При умножении на 2 ?! Хорошая шутка PS: При умножении на степень 2-ки реально изменяется только двоичный порядок, а мантисса остается неизменной, поэтому говорить о каких-то погрешностях - сами понимаете
Абсолютно верно, здесь все числа, и вещественные в том числе, по основанию 2. Для замены порядка понадобятся AND, ADD, OR
Y_Mur Если вещественная переменная типа dword находится в ячейке памяти [temp] и потребовалось ее удвоить: add dword ptr [temp],800000h и всё! FPU здесь не нужен! Сответственно, нужно сделать поправку на qword и tbyte и отследить ситуацию, что бы не был испорчен старший знаковый бит
Mikl___ согласен, но если удвоить нужно по ходу fpu вычислений, то сохранять в память, синхронизировать cpu/fpu и грузить обратно в st0 намного дольше )
Y_Mur Тогда, да fadd, так как fmul это скорее всего некие действия с мантиссой и порядком на порядок должно быть дольше
Хотя если нужно не умножать на степень двойки, а возводить в неё, то даже подход с сохранением в память может увеличить скорость.
Mikl___ Не шути. В данном случае fmul будет заметно дольше только из-за чтения операнда из памяти. А вообще в отличие от целых чисел, fadd и fmul на всех процах выполняется практически за одно время (fadd м.б.чуть-чуть быстрее), именно из-за того, что тормозит fadd, а не fmul (которая выполняется максимум на такт дольше целочисленных mul\imul). Дело в том, что вещ.числа хранятся в нормализованном виде и при умножении достаточно одновременно поксорить знаки, сложить порядки и перемножить мантиссы, и затем произвести коррекцию порядка и сдвиг мантисы на 1, если в мантиссе возникает перенос из старшего разряда. А для сложения нужно сначала привести числа к общему порядку, т.е. определить какое число больше и сдвинуть мантиссу меньшего числа на разность порядков, затем сложить с учетом знака, и затем снова произвести нормализацию (т.к. в отличие от умножения при сложении знаковых чисел в итоге может получиться любой порядок) - а это, сами понимаете, сродни bsr над 64-битной мантиссой. В итоге и получается, что fadd\fsub выполняется примерно столько же, как и fmul - на атлонах одинаково, на пеньках на пару тактов быстрее - но уж никак не "на порядок"