Extrahieren Sie den Bruchteil des Doppelten *effizient* in C

Extrahieren Sie den Bruchteil des Doppelten *effizient* in C


Ich möchte ein IEEE-Double nehmen und alle ganzzahligen Teile davon so effizient wie möglich entfernen.


Ich möchte


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

Ich kümmere mich nicht um den richtigen Umgang mit Denormalen, Unendlichkeiten oder NaNs. Es macht mir nichts aus, ein bisschen herumzuspielen, da ich weiß, dass ich mit IEEE-Doubles arbeite, also sollte es maschinenübergreifend funktionieren.


Verzweigungsloser Code wäre sehr zu bevorzugen.


Mein erster Gedanke ist (in Pseudocode)


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;

Aber das Problem ist, dass ich mir keine effiziente Möglichkeit vorstellen kann, d nach links zu verschieben, bis das letzte Bit des Exponenten Null ist, und es scheint, dass es Null ausgeben müsste, wenn nicht alle letzten Bits gesetzt wären. Dies scheint mit dem Logarithmusproblem zur Basis 2 zusammenzuhängen.


Hilfe bei diesem oder einem besseren Algorithmus wäre sehr willkommen.


Ich sollte wahrscheinlich anmerken, dass der Grund, warum ich verzweigungslosen Code möchte, darin besteht, dass er effizient vektorisieren soll.


Antworten:


Wie wäre es mit etwas Einfachem?


double fraction = whole - ((long)whole);

Dies subtrahiert nur den ganzzahligen Teil des Doubles vom Wert selbst, der Rest sollte die Bruchkomponente sein. Es ist natürlich möglich, dass dies einige Darstellungsprobleme haben könnte.