我正在寻找一个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;
但是问题是我不能想到一个有效的方法来移动左边,直到指数的最后一位为零,加上似乎如果所有的最后一位没有设置,它将需要输出0。这似乎与基数2对数问题有关。
帮助这个算法或任何更好的算法将不胜感激。
我应该注意到,我想要无节点代码的原因是因为我希望它有效地向量化。