Я хочу взять 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.
Мы будем очень благодарны за помощь в этом алгоритме или любых других лучших.
Я, вероятно, должен отметить, что я хочу использовать код без ветвей, потому что я хочу, чтобы он эффективно векторизовался.