我希望采用IEEE double ,并以尽可能有效的方式删除其整数部分。
我想要
1035 ->0
1045.23->0.23
253e-23=253e-23
我不关心正确处理异常,无穷大或NaN。我不介意摆弄,因为我知道我正在使用IEEE doubles,因此它应该可以在所有机器上使用。
无分支代码将是更可取的。
我的第一个想法是(用伪代码)
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为底的对数问题有关。
此算法或任何更好的算法的帮助将不胜感激。
我可能应该注意到,我想要无分支代码的原因是因为我希望它能够有效地向量化。
最佳答案
简单的事情怎么样?
double fraction = whole - ((long)whole);
这只是从值本身中减去double的整数部分,其余部分应该是小数部分。当然,这可能会出现一些表示问题。
关于c - 在C中高效地提取double的小数部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5589383/