比较没有比较运算符的两个数字

时间:2015-01-30 16:23:26

标签: c comparison comparison-operators

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

赋值的约束不允许我使用比较运算符(如>)或任何类型的逻辑(!xif-else)。但是,我可以使用pow库中的sqrtmath.h函数。我也被允许使用算术运算以及模运算。

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

int x = eccentricity / MOON_ORBIT_ECCENTRICITY;

如果0大于MOON_ORBIT_ECCENTRICITY

...将为eccentricity。但是,如果此关系被反转,则x的值可以是任何非零整数。在这种情况下,期望的结果是1

第一个也是最直观(和天真)的解决方案是:

int y = (x / x);

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

int y = (x + 1) % x;

有没有人知道如何解决这个问题?这个似乎这么令人沮丧。

1 个答案:

答案 0 :(得分:0)

上面的

@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>函数没有任何说明。