作为我正在为作业编写的程序的一部分,我需要比较两个数字。本质上,该程序计算给定两个轴的椭圆的偏心率,并且必须将计算出的偏心率值与月球绕地球轨道和地球绕太阳轨道的(给定)偏心率进行比较。如果计算出的偏心率大于给定的偏心率,则需要用值1
表示,否则用值0
表示。所有这些值都是浮点值,特别是 long double
。
赋值的约束不允许我使用比较运算符(如 >
)或任何类型的逻辑(!x
或 if-else
)。但是,我可以使用 math.h
库中的 pow
和 sqrt
函数。我还可以使用算术运算以及模运算。
我知道,如果分母大于分子,我可以利用整数除法来截断小数,即:
int x = 偏心率/MOON_ORBIT_ECCENTRICITY;
...如果MOON_ORBIT_ECCENTRICITY
大于偏心率
,则将为0
。但是,如果这种关系颠倒,则 x 的值可以是任何非零整数。在这种情况下,所需的结果是 1
。
第一个也是最直观(也是天真的)的解决方案是:
int y = (x/x);
如果x
非零,则返回1
。但是,如果 x
是 0
,那么我的程序会因除以零而崩溃。事实上,我一直遇到除以零的问题。这种情况也会发生在以下情况:
int y = (x + 1) % x;
有人知道如何解决这个问题吗?这看起来非常简单。
最佳答案
@lurker上面的评论是一个很好的处理方法eccentricity受 OP 限制。
为了避免复制这一点,请考虑以下不太严重的内容:
// 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>
功能。
关于不使用比较运算符比较两个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240223/