【发布时间】:2015-01-30 16:23:25
【问题描述】:
作为我为作业编写的程序的一部分,我需要比较两个数字。本质上,该程序在给定两个轴的情况下计算椭圆的偏心率,并且它必须将计算出的偏心率的值与月球绕地球轨道和地球绕太阳轨道的(给定)偏心率进行比较。如果计算出的偏心率大于给定的偏心率,则需要用1 的值表示,否则用0 的值表示。所有这些值都是浮点数,特别是long double。
分配的约束不允许我使用比较运算符(如>)或任何类型的逻辑(!x 或if-else)。但是,我可以使用 math.h 库中的 pow 和 sqrt 函数。我还可以使用算术运算和模运算。
我知道如果分母大于分子,我可以利用整数除法来截断小数,即:
int x = eccentricity / MOON_ORBIT_ECCENTRICITY;
...如果MOON_ORBIT_ECCENTRICITY 大于eccentricity,则为0。但是,如果这种关系颠倒过来,那么x 的值可以是任何非零整数。在这种情况下,所需的结果是1。
第一个也是最直观(也是幼稚)的解决方案是:
int y = (x / x);
如果x 不为零,这将返回1。但是,如果x 是0,那么我的程序会因为被零除而崩溃。事实上,我一直遇到除以零的问题。这也发生在以下情况:
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))。这将显着降低您可以使用的x或y的最大值(从 max double 降低到 max double 的 log2),但应该能让您到达那里。我找到了解决方案,但既然这是你的任务...... :)
标签: c comparison comparison-operators