在 C 语言中工作,我想将一个浮点数舍入到它的劣奇整数和它的劣偶整数。求解的速度非常重要(因为每秒计算 2M*20 次)。
我提出这个解决方案:
x_even = (int)floor(x_f) & ~1;
x_odd = ((int)ceil(x_f) & ~1) -1;
我认为弱点是floor
andceil
操作,但我什至不确定。
有人对此解决方案有意见吗?我对它的执行速度很感兴趣,但是如果您有其他解决方案要分享,我将非常乐意对其进行测试:-)。
在 C 语言中工作,我想将一个浮点数舍入到它的劣奇整数和它的劣偶整数。求解的速度非常重要(因为每秒计算 2M*20 次)。
我提出这个解决方案:
x_even = (int)floor(x_f) & ~1;
x_odd = ((int)ceil(x_f) & ~1) -1;
我认为弱点是floor
andceil
操作,但我什至不确定。
有人对此解决方案有意见吗?我对它的执行速度很感兴趣,但是如果您有其他解决方案要分享,我将非常乐意对其进行测试:-)。
也许 ceil 和 floor 函数不是必需的,因为从 double 到 int 的 transtypage 等效于正整数的 floor 函数。
对正整数尝试这样的事情:
double k = 68.8 ; // Because we need something to seed with.
int even = ((int) k & ~1) ; // What you did
int test = ((int) (k+1) & ~1) ; // Little trick
int odd = (test>k) ? odd+1 : odd - 1 ;
我在键盘上对其进行了测试,它在http://codepad.org/y3t0KgwW for C++ 上运行良好,我认为它会在 C 中运行。如果你测试这个解决方案,我很高兴知道它有多快。 ..
请注意:
您没有解释“劣等”是什么意思,但假设您的意思是“小于给定数字的最大偶数/奇数整数”,并假设您有一台 2s 补码机器,您想要:
x_i = (int)floor(x_f);
x_even = x_i & ~1;
x_odd = x_i - (~x_i & 1);
如果您想避免对可能的负符号数执行按位运算的实现依赖性,您可以完全在浮点数中执行它:
x_even = 2.0 * floor(x_f * 0.5);
x_odd = x_even + 1.0 > x_f ? x_even - 1.0 : x_even + 1.0;
这也具有不会溢出大数的优点,尽管它确实为大数提供了 x_odd == x_even (对于浮点表示来说太大而无法表示奇数)。