【问题标题】:round to inferior odd or even integer in C [closed]在C中四舍五入到下奇数或偶数[关闭]
【发布时间】:2013-05-04 09:48:16
【问题描述】:

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

我提出这个解决方案:

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

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

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

【问题讨论】:

  • 那么分别将 1.5 舍入到 1 和 0? -0.5 到 -1 和 -2,对吗?
  • 我认为如果不将其称为“四舍五入”会更有意义。这是一个定义合理的计算(尽管对于 NaN 和超出范围 INT_MININT_MAX 的值应该怎么做?)
  • 其实我今天才读到这个。可能很有趣。 blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1
  • x_f 实际上是数组中的值吗?您使用的是具有相当现代处理器(
  • 我对您的解决方案有疑问。 x_f 为 4.0 时,x_even 为 4,而 x_f 为 5.0 时,x_odd 为 3。真的是你想要的吗?

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


【解决方案1】:

您没有解释“劣等”是什么意思,但假设您的意思是“小于给定数字的最大偶数/奇数整数”,并假设您有一台 2s-complement 机器,您想要:

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(对于浮点表示而言太大而无法表示奇数)。

【讨论】:

    【解决方案2】:

    也许 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 ;  
    

    我在键盘上对其进行了测试,它适用于 C++ 的 http://codepad.org/y3t0KgwW,我认为它适用于 C。如果您测试此解决方案,我很高兴知道它的速度有多快...

    注意:

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

    【讨论】:

    • 从 double 转换为 int 向 0 舍入,而 floor 向 -infinity 舍入,因此它们对于负数是不同的。此外,您已经交换了 oddeven - 您的代码给出了 odd==68even==67
    • 交换是我掌握的。这只是因为我是法国人,我总是忘记哪个是Pair,哪个是Impair。我想这次我错了。顺便说一句,当给定一个负整数时,这段代码显然会下沉。非常感谢您指出交换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多