我正在寻找一个 IEEE double 并以最有效的方式删除它的任何整数部分。
我要
1035 ->0
1045.23->0.23
253e-23=253e-23
我不关心正确处理非正规数、无穷大或 NaN。我不介意有点麻烦,因为我知道我正在使用 IEEE double ,所以它应该可以跨机器工作。
无分支代码会更受欢迎。
我的第一个想法是(伪代码)
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/