Я хочу взять IEEE double и удалить любую целочисленную часть наиболее эффективным способом.
Я хочу
1035 ->0
1045.23->0.23
253e-23=253e-23
Меня не волнует правильная обработкаденормалы, бесконечности или NaNs.Я не возражаю против небольшого переворота, так как знаю, что работаю с двойными кодами IEEE, поэтому он должен работать на разных компьютерах.
Код без ветвлений будет гораздо предпочтительнее.
Моя первая мысль (в псевдоcode)
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.
Помощь с этим алгоритмом, а также любые другие, более эффективные, будет высоко оценена.
Вероятно, я должен отметить, что причина, по которой я хочу получить код без ответвлений, заключается в том, чтоЯ хочу, чтобы это эффективно векторизовало.