Извлечь дробную часть двойного * эффективно * в C

Я хочу взять IEEE double и удалить любую его целую часть наиболее эффективным способом.

Я хочу

1035 ->0
1045.23->0.23
253e-23=253e-23

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

Бесконечный код был бы гораздо предпочтительнее.

Моя первая мысль (в псевдокоде)

char exp=d.exponent;
(set the last bit of the exponent to 1)
d<<=exp*(exp>0);
(& mask the last 52 bits of d)
(shift d left until the last bit of the exponent is zero, decrementing exp each time)
d.exponent=exp;

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

Мы будем очень благодарны за помощь в этом алгоритме или любых других лучших.

Я, вероятно, должен отметить, что я хочу использовать код без ветвей, потому что я хочу, чтобы он эффективно векторизовался.

20
задан Jeremy Salwen 8 April 2011 в 01:10
поделиться