LINUX.ORG.RU
решено ФорумTalks

Получить ответ, больше ли число только арифметикой.

 , ,


0

3

Сразу скажу, я тут упоролся и родилась задача.

Есть числа A и B. Хочу, чтобы в C было 1, если A > B и 0, иначе.

Можно использовать +,-,*,/. Битовые операции нельзя, поскольку числа могут быть вещественными и тогда там нужны слишком забористые вещества. И да, числа со знаком.

Я застрял на полпути - могу дать переменной разный знак в зависимости от A>B или A<=B. Вот так:

A <= B          | A > B
----------------+----------------
A = 5           | A = 7
B = 7           | B = 5
----------------+----------------
C должно быть 0 | С должно быть 1
----------------+----------------
            D = A - B
            E = B - A
----------------+----------------
D = -2          | D =  2
E =  2          | E = -2
----------------+----------------
Как мне теперь привести D к виду 0, если оно <0 и 1, если >0? Условия использовать нельзя.

Линукс тут притом, что это напрямую касается проекта, который разрабатывается под линуксом для линукса.

________________________________

В результате обсуждения вышло, что все это недостижимо для простых арифметических операций, нужны битовые. Спасибо путину alpha за это.

★★★

Последнее исправление: AlexCones (всего исправлений: 4)

Ответ на: комментарий от AlexCones

С квадратным корнем точно можно. А так надо еще подумать.

Axel
()

рациональная функция не может иметь неустранимого разрыва первого рода

alpha ★★★★★
()

«Как мне теперь привести D к виду 0»

Отнимаешь от D D. D=D-D, тогда оно будет либо 0, либо не 0.

Rosko
()
Ответ на: комментарий от Rosko

Отнимаешь от D D. D=D-D, тогда оно будет либо 0, либо не 0.

facepalm

kovrik ★★★★★
()
Ответ на: комментарий от redgremlin

Для приемлемой точности квадратного корня нужно 5-6 итераций (вообще желательно около десятка). Представляете себе количество арифметических действия для решения такой простой задачи, как сравнение двух чисел?

AlexCones ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Входят AND, XOR, NOT. Но, как я уже сказал, чтобы с одинаковым результатом использовать эти операции как для int так и для float нужны особо забористые вещества.

AlexCones ★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Или модуль у вас тоже - не арифметическая операция?

Eddy_Em ☆☆☆☆☆
()

числа могут быть вещественными и тогда там нужны слишком забористые вещества

Используй знания о побитовом представлении вещественных чисел. Без травы, просто осиль IEEE 754. А еще лучше - примени библиотечную функцию sign(a-b).

Manhunt ★★★★★
()
Ответ на: комментарий от Deleted

AlexCones

Битовые операции нельзя

Тьфу ты!

Deleted
()
Ответ на: комментарий от AlexCones

Задача практически в том и состоит, чтобы выразить sign через арифметику.

Не нужно. Пишешь три специализированные функции: для интов, для флоатов, для даблов. Побитовые операции во все поля.

Manhunt ★★★★★
()
Ответ на: комментарий от AlexCones

Если ты из заданного числа составляешь функцию с помощью арифметических операций, у тебя после раскрытия скобок и приведения подобных получится рациональная функция, то есть в числителе многочлен и в знаменателе многочлен.

Эта функция в окрестности любой точки ведет себя как x^k, то есть разрыв типа sgn x иметь не может.

То есть да, без привлечения функции модуля, квадратного корня или какого-нибудь сравнения задача нерешаема.

alpha ★★★★★
()
Ответ на: комментарий от alpha

Т.е., если я правильно себе это вообразил, задача сводится к тому, чтобы выразить |x| через арифметические операции. Или невозможность этого доказывается таким же образом?

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

И не надо меня с мысли сбивать. Знак в старшем бите содержится. Так что для int32 и float можно общую функцию sign использовать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Manhunt

Задача в том, чтобы выразить через арифметику функцию Хевисайда. См. книжку «programming pearls». Там это есть.

Deleted
()
Ответ на: комментарий от AlexCones

Таким же, только можно разрыв производной посмотреть. У |x| производная sgn x, а у рациональной функции производная опять-таки рациональная функция

Ну или просто понять, что задача представления модуля рациональной функцией полностью эквивалентна задаче представления функции знака, потому что знак sgn x= x/|x|. Если бы модуль можно было бы представить, то можно было бы и знак, а это невозможно по доказанному.

alpha ★★★★★
()
Ответ на: комментарий от alpha

То есть чистой математикой, четырьмя операциями, без использования особенностей представления числа и дополнительных фокусов - нерешаемо.

alpha ★★★★★
()
Ответ на: комментарий от alpha

Да что ж вы так весь кайф-то обламываете? :(

Спасибо, anyway.

AlexCones ★★★
() автор топика

В общем, что-то вроде

s = sizeof(a)*8-1;
result = ~((a & 1<<s)>>s)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от AlexCones

Согласен, херню спорол. А если сложить D c максимальным числом в системе (longint e.g). Если D отрицательное - получим число, если положительное - ошибку.

Rosko
()
Ответ на: комментарий от cvs-255

ну бесконечным рядом-то много разных функций можно написать :)

alpha ★★★★★
()
Ответ на: комментарий от XVilka

А на читаемом языке нельзя? И да, ничего не имею против вашего языка, но я понятия не имею, что вы написали.

AlexCones ★★★
() автор топика
Ответ на: комментарий от AlexCones

Блин, только сейчас увидел, что битовые операции нельзя.

XVilka ★★★★★
()
Ответ на: комментарий от XVilka

JC - переход, если флаг установлен.

Ой, ей, без if-ов же!

AlexCones ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.