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