Extrait de partie fractionnaire de la double *efficace* en C

Je suis à la recherche de prendre un IEEE double et enlever toute la partie entière de la manière la plus efficace possible.

Je veux

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

Je ne se soucient pas correctement la manipulation de la denormals, infinis, ou de NaNs. Je n'ai pas l'esprit à peu se tourner, car je sais que je suis en train de travailler avec la norme IEEE double, donc, il faut travailler sur des machines.

Sans branches code serait bien préférable.

Ma première pensée est (en pseudo 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;

Mais le problème est que je ne peux pas penser à un moyen efficace de changement d à gauche jusqu'à ce que le dernier bit de l'exposant est égal à zéro, et en plus il semble qu'il aurait besoin à la sortie de zéro si tous les derniers morceaux n'étaient pas définis. Cela semble être liée à la base 2 logarithme problème.

Aider avec cet algorithme, ou mieux serait très apprécié.

Je devrais sans doute remarque que la raison pour laquelle je veux sans branches code est parce que je le veux efficacement vectoriser.