Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不使用比较运算符比较两个数字_C_Comparison_Comparison Operators - Fatal编程技术网

C 不使用比较运算符比较两个数字

C 不使用比较运算符比较两个数字,c,comparison,comparison-operators,C,Comparison,Comparison Operators,作为我为作业编写的程序的一部分,我需要比较两个数字。本质上,该程序计算给定椭圆两轴的偏心率,并将计算出的偏心率值与(给定)月球绕地球轨道和地球绕太阳轨道的偏心率进行比较。如果计算的偏心距大于给定的偏心距,则需要用1值表示,否则,用0值表示。所有这些值都是浮点值,具体来说就是长双精度 赋值的约束条件不允许我使用比较运算符(如)或任何类型的逻辑(!x或如果其他)。但是,我可以使用math.h库中的pow和sqrt函数。我还可以使用算术运算和模运算 我知道如果分母大于分子,我可以利用整数除法截断小数,

作为我为作业编写的程序的一部分,我需要比较两个数字。本质上,该程序计算给定椭圆两轴的偏心率,并将计算出的偏心率值与(给定)月球绕地球轨道和地球绕太阳轨道的偏心率进行比较。如果计算的偏心距大于给定的偏心距,则需要用
1
值表示,否则,用
0
值表示。所有这些值都是浮点值,具体来说就是长双精度

赋值的约束条件不允许我使用比较运算符(如
)或任何类型的逻辑(
!x
如果其他
)。但是,我可以使用
math.h
库中的
pow
sqrt
函数。我还可以使用算术运算和模运算

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

intx=偏心率/月球轨道偏心率

。。。如果
月球轨道偏心率
大于
偏心率
,则将为
0
。但是,如果将此关系反转,则
x
的值可以是任何非零整数。在这种情况下,期望的结果是
1

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

inty=(x/x)

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

inty=(x+1)%x

有人知道如何解决这个问题吗?这似乎很容易让人沮丧。

上面的评论是一个很好的方法来处理OP限制的问题。
为了不复制,考虑下面的不太严重:



Wink,Wink:OP没有提到
功能。

你检查过天花板和地板功能吗?如果你不允许使用控制语句,比如
如果
你应该如何使用比较结果?你可以使用位运算吗?要生成一个-1、0或1(小于、等于、大于)来比较两个数字,你可以使用
(a-b)/fabs(a-b)
。作为提示,您可以使用
pow
来避免
0
值。即,操纵
pow(2,x)
power(2,y)
pow(2,x-y)
这将显著降低您可以使用的
x
y的最大值(从max double到max double的log2),但应该可以让您达到目的。我找到了一个解决方案,但由于这是您的任务…:)
// 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);
}