2

在 C 语言中工作,我想将一个浮点数舍入到它的劣奇整数和它的劣偶整数。求解的速度非常重要(因为每秒计算 2M*20 次)。

我提出这个解决方案:

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

我认为弱点是floorandceil操作,但我什至不确定。

有人对此解决方案有意见吗?我对它的执行速度很感兴趣,但是如果您有其他解决方案要分享,我将非常乐意对其进行测试:-)。

4

2 回答 2

0

也许 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 中运行。如果你测试这个解决方案,我很高兴知道它有多快。 ..

请注意:

  • 这不是一个好的答案,因为它掩盖了负整数的存在。
  • 范围仅限于整数'。
  • 我交换了奇数和偶数,感谢克里斯的评论,我更正了。
  • 我只是在添加我不起眼的石头:)
于 2013-05-03T16:41:29.747 回答
0

您没有解释“劣等”是什么意思,但假设您的意思是“小于给定数字的最大偶数/奇数整数”,并假设您有一台 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 (对于浮点表示来说太大而无法表示奇数)。

于 2013-05-03T23:19:52.587 回答