【问题标题】:Comparing two numbers without comparison operators在没有比较运算符的情况下比较两个数字
【发布时间】:2015-01-30 16:23:25
【问题描述】:

作为我为作业编写的程序的一部分,我需要比较两个数字。本质上,该程序在给定两个轴的情况下计算椭圆的偏心率,并且它必须将计算出的偏心率的值与月球绕地球轨道和地球绕太阳轨道的(给定)偏心率进行比较。如果计算出的偏心率大于给定的偏心率,则需要用1 的值表示,否则用0 的值表示。所有这些值都是浮点数,特别是long double

分配的约束不允许我使用比较运算符(如>)或任何类型的逻辑(!xif-else)。但是,我可以使用 math.h 库中的 powsqrt 函数。我还可以使用算术运算和模运算。

我知道如果分母大于分子,我可以利用整数除法来截断小数,

int x = eccentricity / MOON_ORBIT_ECCENTRICITY;

...如果MOON_ORBIT_ECCENTRICITY 大于eccentricity,则为0。但是,如果这种关系颠倒过来,那么x 的值可以是任何非零整数。在这种情况下,所需的结果是1

第一个也是最直观(也是幼稚)的解决方案是:

int y = (x / x);

如果x 不为零,这将返回1。但是,如果x0,那么我的程序会因为被零除而崩溃。事实上,我一直遇到除以零的问题。这也发生在以下情况:

int y = (x + 1) % x;

有人知道如何解决这个问题吗?这似乎非常简单。

【问题讨论】:

  • 你检查过天花板和地板的功能吗?
  • 如果不允许使用if这样的控制语句,你将如何使用比较结果?
  • 你可以使用按位运算吗?
  • 要生成-1、0或1(小于、等于、大于)比较两个数字,您可以使用(a-b)/fabs(a-b)
  • 作为提示,您可以使用pow 来避免0 值。 ,操纵pow(2, x)power(2, y)pow(2, x-y)pow(2, fabs(x-y))。这将显着降低您可以使用的 xy 的最大值(从 max double 降低到 max double 的 log2),但应该能让您到达那里。我找到了解决方案,但既然这是你的任务...... :)

标签: c comparison comparison-operators


【解决方案1】:

@lurker 上面的评论是处理受 OP 限制的eccentricity 的好方法。
为了不复制它,请考虑以下不太严重的情况:


// Return e1 > e2
int Eccentricity_Compare(long double e1, long double e2) {
  char buf[20];
  // print a number beginning with 
  //  if e2 >= e1: `+`
  //  else `-`
  sprintf(buf, "%+Le", e2 - e1);  // reverse subtraction for = case
  const char *pm = "+-";
  char *p = strchr(pm, buf[0]);
  return (int) (p - pm);
}

眨眼,眨眼:OP 对 <stdio.h> 函数只字未提。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多