2015-01-30 7 views
0

Как часть программы, которую я пишу для задания, мне нужно сравнить два числа. По сути, программа вычисляет эксцентриситет эллипса, учитывая его две оси, и ему приходится сравнивать значение вычисленного эксцентриситета с (заданной) эксцентриситетом орбиты Луны вокруг Земли и земной орбитой вокруг Солнца. Если вычисленный эксцентриситет больше заданного эксцентриситета, то это должно быть представлено значением 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

Вы проверили функции потолка и пола? –

+1

Если вам не разрешено использовать контрольные выражения типа 'if', как вы должны использовать результат сравнения? – harper

+0

Можете ли вы использовать побитовые операции? –

ответ

0

@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); 
} 

подмигивание, подмигивание: О.П. ничего не сказал о <stdio.h> функции.

Смежные вопросы