在C中舍入到次等奇数或偶数整数

时间:2013-05-03 16:12:01

标签: c++ c optimization floating-point ceil

使用C语言,我想将一个浮点数舍入到它的次奇数整数和它的次偶数整数。 解决方案的速度非常重要(因为它每秒计算2M * 20次)。

我建议这个解决方案:

x_even = (int)floor(x_f) & ~1;
x_odd  = ((int)ceil(x_f) & ~1) -1;

我认为弱点是floorceil操作,但我甚至不确定。

是否有人对此解决方案发表评论;我对它的执行速度很感兴趣,但如果你有另一个解决方案可以分享,我会非常乐意测试它: - )。

2 个答案:

答案 0 :(得分:0)

也许ceil和floor函数不是必需的,因为从double到int的transtypage等于正整数的floor函数。

为POSITIVE INTEGER尝试类似的东西:

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 ;  

我在键盘上测试了它,它适用于C ++的http://codepad.org/y3t0KgwW,我认为它将在C中。如果你测试这个解决方案,我会很高兴知道它有多快..

请注意:

  • 这不是一个好的答案,因为它会影响负整数的存在。
  • 范围仅限于整数。
  • 我交换了奇数和偶数,我纠正了谢谢Chris的评论。
  • 我只是添加了我不起眼的石头:)

答案 1 :(得分:0)

你没有解释'劣等'你的意思,但假设你的意思是'最大偶数/奇数小于给定数字',并假设你有一台2s补码机器,你想要:

x_i = (int)floor(x_f);
x_even = x_i & ~1;
x_odd = x_i - (~x_i & 1);

如果你想避免在可能的负数有符号数上执行按位运算的实现依赖性,你可以完全在float中执行:

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(对于浮点表示来说太大而不能表示奇数)。