Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Поменять ноль и не ноль местами


Автор: _Y_ 27.9.2014, 13:52
Еще одна странная задача. Решить ее надо не прибегая к операторам сравнения, а написав выражение в виде традиционной функции.

Имеется действительное число X равное или не равное нулю. Надо написать формулу F(X) избегающую операторов сравнения, рузультатом которой было бы:
Если не равен нулю F(X)=0
Если X равен нулю F(X) = любое действительное число.

Спасибо

Автор: Dremuk 27.9.2014, 22:06
по-моему таких функций нет

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Pomenyat-nol-i-ne-nol-mestami-id5426974bae2015261f8b4567#findElement_E7045_54270ac9ae20158a652d0af5_0

Автор: Game-lot 30.9.2014, 07:45
На php:

Код

function nullPull($x){
    //если $x - не нуль, то ф-я возвращает 0
    if (!$x) {
        return 0;    
    }
    //иначе вызываем функцию
    else {
        return F($x)
    }
}

function F($y){
    //здесь какая-то функция
    return $y;
}



Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Pomenyat-nol-i-ne-nol-mestami-id5426974bae2015261f8b4567#findElement_E7045_542a354eae2015ee1a8b481d_0

Автор: _Y_ 30.9.2014, 21:51
Game-lot, спасибо за Ваш труд, но задача не в том, чтобы написать программу, а в том, чтобы выразить алгебраически.

Автор: maxim1000 1.10.2014, 10:56
вопрос в том, что можно использовать
результирующа функция не является непрерывной, поэтому её не получится составить из непрерывных функций

Автор: baldina 1.10.2014, 11:21
_Y_, речь о действительных числах или их компьютерном представлении?

Автор: baldina 1.10.2014, 12:20
Цитата(_Y_ @  27.9.2014,  13:52 Найти цитируемый пост)
 в виде традиционной функции

y=|x| это традиционная? а если можно abs, то и sgn можно?
тогда 
f(x) = 1-sgn(|x|)

Автор: _Y_ 1.10.2014, 21:32
Цитата(baldina @  1.10.2014,  11:21 Найти цитируемый пост)
_Y_, речь о действительных числах или их компьютерном представлении? 

Речь идет о формуле, которая будет написана на доске и должна быть понятна людям с весьма средним образованием. Поэтому:
  • Компьютерное представление не проходит.
  • Функция sgn не проходит. Тем более, что это не более, чем спрятанные операторы сравнения.
  • Абсолютное значение может пройти.
  • Если абсолютное значение не пройдет, то вместо него пойдет корень из квадрата: sqrt(x*x)


Автор: ksili 2.10.2014, 08:12
Код

double strange(double f)
{
    double res;

    try
    {
         res = f/f - 1;
    }
    catch(...)
    {
         res = 3.1415;
    }

    return res;
}

 smile 

Автор: baldina 2.10.2014, 08:59
Цитата(_Y_ @  1.10.2014,  21:32 Найти цитируемый пост)
Речь идет о формуле, которая будет написана на доске и должна быть понятна людям с весьма средним образованием

посмотрите на определение https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%A5%D0%B5%D0%B2%D0%B8%D1%81%D0%B0%D0%B9%D0%B4%D0%B0. она, как и ваша, разрывная, но её определение имхо понятно всем

Автор: Akina 2.10.2014, 11:33
ksili, конструкция try ... catch содержит неявный if.

Добавлено через 2 минуты и 8 секунд
Цитата(baldina @  2.10.2014,  09:59 Найти цитируемый пост)
посмотрите на определение функции хэвисайда

Не пойдёт. Иначе решение - тупо определить по аналогии "функцию baldina", которая имеет значение 1 при нулевом аргументе, и 0 - при ненулевом. Её аналитические приближения несложно получить модификацией приближений для функции Хевисайда.

Автор: baldina 2.10.2014, 12:58
вряд ли приближеные выражения проще для понимания. так же как и неявные определения

Добавлено через 47 секунд
потому что 
Цитата(_Y_ @  1.10.2014,  21:32 Найти цитируемый пост)
Речь идет о формуле, которая будет написана на доске и должна быть понятна людям с весьма средним образованием.


кстати, _Y_, а какова цель изложения этим людям?

Добавлено через 4 минуты и 51 секунду
Цитата(_Y_ @  1.10.2014,  21:32 Найти цитируемый пост)
Абсолютное значение может пройти

а здесь разве нет "спрятанных операторов сравнения"?
если взять "правильное" определение, то и sgn подойдет в формулировке x/x c учетом того, что любой число, деленное на 0 есть 0, невзирая на знаменатель

Автор: tzirechnoy 3.10.2014, 11:23
exp(x)-1

Автор: Akina 3.10.2014, 11:28
Цитата(tzirechnoy @  3.10.2014,  12:23 Найти цитируемый пост)
exp(x)-1 

Угу... только надо наоборот.

Кстати... формально можно применить

f(x) = 1/x - 1/x

Для всех ненулевых иксов получится ноль, а для нуля - неопределённость, которая ничему не равна, в том числе не равна нулю.

Автор: tzirechnoy 3.10.2014, 11:34
Плохо заканчивается неделя, да.
Сука, как можно так ментально деградировать.

Автор: ksnk 3.10.2014, 13:52
Очевидно, что получить функцию со скачками, определенную на всей координатной оси можно комбинируя такие-же функции со "скачками". тангенс, к примеру, просто так не применить, он не для всех значений определен.
А какие вообще есть разрывные функции, которые определены везде?  Остаток от деления - пойдет? Записывается, вроде как x%y

(1/x-1/x) - это какой-от математический самообман  smile  у него такое же применение как и у  0/x

Добавлено @ 14:04
Если остаток от деления можно использовать - то получится что-то вроде такого

y=1-((-x)%1)+(x%1) ; // остаток от деления на 1 - дробная часть.
на отрезке от -1 до 1 получится 0, кроме значения 0. там будет 1

остается только "размазать" все действительные значения на интервал -1...1 так чтобы в 0 был 0. Например 2*arctg()/pi

итого y=1-((-2*arctg(x)/pi)%1)+(2*arctg(x)/pi)%1

P.S. формула, которую можно проверить в http://www.aiportal.ru/services/graph.html

Цитата

1-(-(2*atan(x)/pi)-floor(-(2*atan(x)/pi)))- 2*atan(x)/pi+floor(2*atan(x)/pi);


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

Для функции округления - более "простая" конструкция
Цитата

1+floor(2*atan(x)/pi)+floor(-2*atan(x)/pi);

Автор: Akina 3.10.2014, 14:09
Цитата(ksnk @  3.10.2014,  14:52 Найти цитируемый пост)
(1/x-1/x) - это какой-от математический самообман  

Почему? формально все условия выполнены.


Цитата(ksnk @  3.10.2014,  14:52 Найти цитируемый пост)
у него такое же применение как и у 0/x

Вероятно, y = 0/x? Ну да, хотя это решение и более спорное, ибо при нулевом иксе придётся выбирать между вариантами "ноль" и "неопределённость", т.е. ответ неоднозначен.

Добавлено через 1 минуту и 28 секунд
Цитата(ksnk @  3.10.2014,  14:52 Найти цитируемый пост)
 Остаток от деления - пойдет? Записывается, вроде как x%y

При условии, что эта операция, изначально определённая только на множестве целых, расширяется и на множество действительных чисел. Что не совсем корректно.

Автор: ksnk 3.10.2014, 14:16
Цитата(Akina @  3.10.2014,  14:09 Найти цитируемый пост)
Вероятно, y = 0/x? Ну да, хотя это решение и более спорное, ибо при нулевом иксе придётся выбирать между вариантами "ноль" и "неопределённость", т.е. ответ неоднозначен.

Формально - можно и написать, однако значение функции в  "неопределенных" точках, обычно вычисляют с помощью пределов. А таким методом разрывное значение не получить, разве что предел окажется неопределен. А это не наш случай... В этом случае "предельное" значение в 0-е будет 0...

Автор: Akina 3.10.2014, 14:41
Не припоминаю, чтобы в задаче требовалось ВЫЧИСЛИТЬ. Требовалось составить представление такой функции в виде элементарных функций, уровня "для колхозников".

Автор: ksnk 3.10.2014, 15:12
Кстати, 
Цитата

1+floor(2*atan(x)/pi)+floor(-2*atan(x)/pi);

можно построить график на http://www.aiportal.ru/services/graph.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)