c - 在 C 中有效地提取 double 的小数部分

标签 c floating-point double micro-optimization bit-manipulation

我正在寻找一个 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/

相关文章:

json - Jasper Reports - 从 JSON 解析 Double 值

c - 在 C 中屏蔽和提取位

c++ - Sublime Text 3 中的 C11 和 C++11 问题

c++ - 这是 Clang 的错误还是我的错误?

python - 在 Python 中使用用户输入调用/选择变量(浮点值)

javascript - 在 Javascript 中处理浮点精度

java - 双重运算的错误输出

c - 关于 pthread_rwlock_wrlock 和 pthread_rwlock_wrlock 的问题

c - 这段代码中创建了多少个进程?

c - 使用 %f 格式说明符打印 int