使用C语言,我想将一个浮点数舍入到它的次奇数整数和它的次偶数整数。 解决方案的速度非常重要(因为它每秒计算2M * 20次)。
我建议这个解决方案:
x_even = (int)floor(x_f) & ~1;
x_odd = ((int)ceil(x_f) & ~1) -1;
我认为弱点是floor
和ceil
操作,但我甚至不确定。
是否有人对此解决方案发表评论;我对它的执行速度很感兴趣,但如果你有另一个解决方案可以分享,我会非常乐意测试它: - )。
答案 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中。如果你测试这个解决方案,我会很高兴知道它有多快..
请注意:
答案 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(对于浮点表示来说太大而不能表示奇数)。