LINUX.ORG.RU
ФорумTalks

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

 , ,


0

3

Дубль два - можно использовать Ln и e^x.

Напомню тем, кто не слышал о первой части: Используя только лишь арифметические операции (теперь и вкупе с Ln и Exp) нужно получить Result=1, если поданный на вход A больше поданного на вход B и Result=0 во всех других случаях. Условия использовать нельзя.

Иными словами:

F(A, B) = | 1, A>B
          | 0, A<=B

Накатал:

A, B - in
C - out (If A>B, C=1 иначе C=0)

Sqrt(X) = e^(1/2 * Ln(X))
Abs(X) = Sqrt(X^2)
D=A-B

C = (D/Abs(D) +1)/2

На A=7, B=5 пашет, на B=7, A=5 пашет. Но...

Но так, как Ln не может принимать 0 и на 0 делить нельзя, то...
1) Sqrt(X) = e^(1/2 * Ln(X)) Является неправильной, поскольку Sqrt(0) не +INF, а 0.
2) Из-за 1) не пашет Abs(0)
3) Согласно 1) и 2) С=ERROR при A=B.

Что скажете, господа мехматовцы?

Блин, а почему бы не перестать насиловать себе разум? Что мешает воспользоваться обычной логической операцией?

djambeyshik ★★★★★
()

нужно получить Result=1, если поданный на вход A больше поданного на вход B и Result=0 во всех других случаях

А теперь, не пользуясь логикой, докажи что 2+2=4 && !=5.
Только логикой при рассуждениях пользоваться нельзя.

Bad_ptr ★★★★★
()

А вычисление md5, случаем, не арифметическое? Тогда можно везде его прибавлять к А и В, а потом, соответственно, отнимать. Тогда нигде не будет ноль в делителе.

abraziv_whiskey ★★★★★
()

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

Вот же тебе делать нечего…

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

Вот же тебе делать нечего…

У меня просто хорошие вещества. И да, реализовать безопасный и точный SQRT и ABS надо в любом случае.

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

ОП-пост не читали?

1) Sqrt(X) = e^(1/2 * Ln(X)) Является неправильной, поскольку Sqrt(0) не +INF, а 0.
2) Из-за 1) не пашет Abs(0)
3) Согласно 1) и 2) С=ERROR при A=B.

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

1) Sqrt(X) = e^(1/2 * Ln(X)) Является неправильной, поскольку Sqrt(0) не +INF, а 0.

а оно 0 и получается.

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

Если не хочется связываться со сравнениями, то abs проще всего через битовые операции реализовать, как я уже много раз говорил. И sqrt через логарифмы реализовывать не надо: точность будет ниже плинтуса.

Eddy_Em ☆☆☆☆☆
()

Блин, ты сам-то проверял п.1? swelf-то прав:

cat 2.c
#include <math.h>
#include <stdio.h>
main(){
  printf("ln(0)=%g, exp(0.5*ln(0))=%g\n", log(0.), exp(0.5*log(0.)));
}
gcc -lm 2.c && ./a.out
ln(0)=-inf, exp(0.5*ln(0))=0

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

Нет, конечно, потому что при таком форматировании это настоящая пытка!

unanimous ★★★★★
()

Кстати, ТС, ты в курсе, что твоя задача неразрешима? Любая «допустимая» суперпозиция (имеется в виду в области определения, безо всяких «расширенных» чисел, вроде ±inf) элементарных функций непрерывна, поскольку непрерывны элементарные функции (повторю, внутри своих областей определений, которые полагаются замкнутыми), а ты хочешь получить функцию с разрывом первого рода.

Неудивительно, что лезут всякие «специальные» случаи.

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

Да, моё рассуждение не стоит воспринимать как «доказательство», скорее это «иллюстрация».

Используя, например, предельный процесс, можно из непрерывных функций получить разрывную, например:

lim_{n \to \infty} x^n = { 0, if x <1, 1, if x==1, \infty, x>1

Также деление дает разрыв там, где знаменатель обращается в 0. Опять-таки неудивительно, что в решении возникло деление.

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

Задача стоит как выразить f(a,b) в терминах арифметических функций (плюс экспонента и логарифм) используя только их композицию.

unanimous ★★★★★
()

Sqrt(X) = e^(1/2 * Ln(X)) Является неправильной, поскольку Sqrt(0) не +INF, а 0

ну так поменяй логарифм и e^x местами

unC0Rr ★★★★★
()

Какой феерически бессмысленный бред. В процессорах x86 для этого используются всякие флаги, типа если результат последней операции 0, то процессор сам, автоматически, устанавниает флаг ZF, флаг SF это знак операции.

Применительно к условию задачи, нужно просто вычесть В из А и вернуть состояние флага SF.

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

В процессорах x86 для этого используются всякие флаги, типа если результат последней операции 0, то процессор сам, автоматически, устанавниает флаг ZF

Ты что, не понимаешь что ли, что на уровне схемотехники там и реализуется if?

Вопрос топикстартера не такой уж и бессмысленный, тут наклевывается неплохая теоремка неразрешимости.

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

Ты что, не понимаешь что ли, что на уровне схемотехники там и реализуется if?

И где там if? Во втором случае это просто копирование старшего бита в флаг, в первом это !or всех битов.

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

и? Как это соотносится с решением задания ТС в виде A-B, вернуть старший бит результата операции?

По-моему, ты тупой. Как относится? Это нарушает условие задачи, просто потому, что возврат бита знака результата эквивалентно *условию* проверки, что все биты результата равны нулю. Просто условная конструкция реализована на уровне схемотехники.

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

«Какой феерически бессмысленный бред.»

Я сказал о том, что не вижу никакого практического смысла в задаче, поскольку операция сложения разрешена, а копирование старшего бита из основного регистра процессора все равно везде в x86 реализована, и нисколько не затратна.

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

Я сказал о том, что не вижу никакого практического смысла в задаче

Разве практический смысл был в условиях задачи? Это упражнение для ума, абстракция. Если тебе не интересно — просто не участвуй.

unanimous ★★★★★
()

ты в задаче не оговорил входные множества.

так шта:

помня о эквивалентости e(x)=cos(ix)+isin(ix) сам распишеш как получить 1 if greater 0 otherwise для действительных входов( на плоскости отношение предшествования не однозначна и классы эквивалентности несчётной мощьности могут быть)

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

Именно что. Но ему нужна единица. Чтобы получить именно единицу - надо делить на (а - б), а это может быть нельзя, если а = б

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

ваще можно вот так записать: (А-Б)^2/(А-Б)^(2.0)/2+1/2

во втором случае (^(2.0)) поступаем как с дробной степенью

хотя, в принципе, если А=Б, получается корректно, но всё же можно и так:

x=2^((А-Б)^2/(А-Б)^(2.0))-3/4

f(А,Б)=x^2/(x^2.0)/2+1/2

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

x=2^((А-Б)^2/(А-Б)^(2.0))-3/4
((А-Б)^2/(А-Б)^(2.0))
[...]/(А-Б)^(2.0)

Если А-Б=0 (А=Б), то получается /0.

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

где-то так

#define negative(x) (((unsigned char)((char)(x)))/128)
или возможно
#define morethen(a,b) ((int)((double)(a-b)/((double)(a-b)+E))+1)/2

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

Может потому, что это и есть создание if`а?

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

Чего?

вы от вычислительной математики даже дальше чем я? это параметр точности. Как вам уже намекали, интерполировать ступенчатую функцию в заданном диапазоне вы сможете только с некоторым приближением. В принципе арктангенсом можно получить практически искомое но с большими погрешностями в области |A-B|<2*epsilon

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

вы от вычислительной математики даже дальше чем я? это параметр точности.

Мне казалось, что мы его на матане как-то по другому рисовали.

Как вам уже намекали, интерполировать ступенчатую функцию в заданном диапазоне вы сможете только с некоторым приближением.

Ок, а какую функцию нужно минимально иметь, чтобы решать такую задачу? Я имею в виду функции типа Хевисайда или Signum.

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

Достаточно Хевисайда, вроде (signum с ней связан очено просто: sign(x) = 2 Heaviside(x) - 1) Тогда решение тривиально: f(a,b) = Heaviside(a - b).

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