[an error occurred while processing this directive]
|
Я сначала не хотел делать, но потом всё равно понадобилось для реализации тригонометрии и тому подобного... Стало помедленнее, но все равно на сложениях/умножениях/делениях раз так в 5 побыстрее чем на встроенной эмуляции флоатов. При этом точность у меня всё-таки 22 бита против 23 у флоата (если старшую 1 в нормализованном представлении не считать). На самом деле меня больше всего интересует как лучше сделать выравнивание порядков для сложения, коррекция экспонент (нормализация результата) итп. с помощью intrinsic...
Вот например моё умножение:
inline CAFloat operator * (const CAFloat& y) const
{
int cx = _clr(x, 0, 23);
int cy = _clr(y.x, 0, 23);
int resexp = _clr(_sadd2(cx, cy) + 0x01000000, 0, 23);
int min = _min2(_min2(cx, cy), resexp);
if(_clr(min, 0, 24)==0x80000000)
return CAFloat(min);
int mx = _extr(x, 0x100);
int my = _extr(y.x, 0x100);
int mant = ((_mpyhir(mx, my)) + (_mpyluhs(mx, my)>>15));
int norm = _norm(mant);
resexp -= (norm<<24) & (norm-31);
return CAFloat(_extu(mant, norm, 8) + resexp);
}
E-mail: info@telesys.ru