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)

деление вещественное? умножение при переполнение как?

т.е у нас числа реально действительные или всё таки согласно стандарту представления плавающей точки известной битовой ширины?

если второе и операции +, -, * , / над ними то из факта конечности числа различных чисел ( при том что классы эквивалентности рельных дейстивтельных битовым строкам могут быть мощьности 0,1 и что важно больше 1) то можно составить такой список операций который на входе принимает два битовых строки - плавающие и выдаёт 2 различных битовых строки в зависимости от нужной функции . то что список операций может квадратично(если не быстрее) увеличиватся от битовой длины аргументов не отмеяет факта возможности.

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

Для приемлемой точности квадратного корня нужно 5-6 итераций (вообще желательно около десятка)

По-моему так много не нужно, тем более что нужен целочисленный корень. s_{n+1}=(s_n+x/s_n)/2

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

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

Но функцию корня можно выразить через бесконечную рациональную функцию, разве нет?

Xenius ★★★★★
()
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
----------------+----------------

Ну а дальше?

       F = (2 * D + E) / 2
----------------+----------------
F = -1          | F =  1
----------------+----------------
А теперь немного «магии»
       C = (F + 1) / 2
----------------+----------------
C = 0          | C =  1
----------------+----------------
ВАУ!

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

И не надо извращений с битами и рядами. Зачем изобретать велосипеды, которые чуть ли не на каждой второй олимпиаде и так изобретают?

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

У человека магия, а ты тут со своими глупостями :)

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

Да, точно. Проглядел... Задача сводится к вычислению модуля числа через арифметические операции.

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

Не пашет же! Как уже сказали, 5 и 10.

Уже доказали, что на одной арифметике это не сделать. Как вариант - через ln и exp:

((A-B)/((e^(1/2 * Ln(A-B)^2))+1))/2

Но это не арифметика.

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

По сути то, что требуется это и есть как бы проверка на равенство (ну или может быть выведена из неё: !>, !< -> ==)

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

Если вдуматься, то если недоступна операция проверки на равенство, то нафига получать С равный 0 или 1? Проверить то результат мы не сможем! А если результат выводится пользователю, то почему мы не можем вывести оригинальные A и B, чтобы он сам сравнил, какое из них больше?

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

то почему мы не можем вывести оригинальные A и B, чтобы он сам сравнил,

Оригинально, да. Если вам сейчас система начнет по 10 000 запросов в секунду давать, далеко ваши иксы полетят?

Если вдуматься, то если недоступна операция проверки на равенство, то нафига получать С равный 0 или 1?

Потому, что это и есть реализация проверки на равенство.

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

И как же она, простите, должна работать? Эта реализация проверки на равенство, если не выдавать 10 000 запросов пользователю? Я не издеваюсь, не думайте. Я просто думаю, что к задаче стоит попробовать подойти с другой стороны.

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

И как же она, простите, должна работать?

Например:

У нас есть два числа, A и B. Если A > B, то нам надо перейти по адресу H в памяти и начать выполнение инструкций оттуда. Т.е. что-то вроде старого консольного бейсика: IF A > B THEN GOTO H (ну или в данном случае слово GOTO можно опустить). Как работает на данном варианте:

F(X, Y) - Выдает 1, если X>Y, 0 - иначе.

C = F(A, B)
C = C * (H - CurrentAddress)
GOTO (C + CurrentAddress)

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