作为我为作业编写的程序的一部分,我需要比较两个数字。本质上,该程序计算椭圆的偏心率,给定其两个轴,并且必须将计算的偏心率的值与月球围绕地球轨道的(给定)偏心率以及地球围绕太阳的轨道进行比较。如果计算的偏心率大于给定的偏心率,则需要用值1
表示,否则值0
。所有这些值都是浮点值,特别是long double
。
赋值的约束不允许我使用比较运算符(如>
)或任何类型的逻辑(!x
或if-else
)。但是,我可以使用pow
库中的sqrt
和math.h
函数。我也被允许使用算术运算以及模运算。
我知道如果分母大于分子,我可以利用整数除法来截断小数,即:
int x = eccentricity / MOON_ORBIT_ECCENTRICITY;
0
大于MOON_ORBIT_ECCENTRICITY
, ...将为eccentricity
。但是,如果此关系被反转,则x
的值可以是任何非零整数。在这种情况下,期望的结果是1
。
第一个也是最直观(和天真)的解决方案是:
int y = (x / x);
如果1
非零,则会返回x
。但是,如果x
为0
,那么我的程序会因为除零而崩溃。事实上,我一直在遇到零除的问题。在以下情况下也会发生这种情况:
int y = (x + 1) % x;
有没有人知道如何解决这个问题?这个似乎这么令人沮丧。
答案 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>
函数没有任何说明。