На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (5) « Первая ... 2 3 [4] 5  все  ( Перейти к последнему сообщению )  
> Нецелая степень отрицательного числа
    Цитата JoeUser @
    Я читаю, и у меня из глаз льется кровь! Что такое "отрицательная степень", что такое "дробная степень" все же знают? Все знают как меняется знак от четности/нечетности возведения в степень, все знают что можно извлекать корень нечетной степени из отрицательного числа не уходя в комплексное исчисление? Нафига все эти домыслы?!!! Неужели курса математики старших классов мало???!
    В моём понимании проблема в том, что мы не можем с уверенностью заявлять, то -0.2 = -1/5. Как ни прискорбно. Потому что это может быть -0.2000000000000000000000012345 или (наверное) -2/10, как кто-то выше говорил.
    Короче говоря, у меня только 1 мысль: встроить callback-функцию, которая будет вызывать юзерскую процедуру, а эта процедура уже будет решать что делать с этим безобразием...
    Плюс сделать ещё пару функций типа Root (корень нужной степени) и FracPower (где задаются X, P, Q, т.е. это комбинация Root и Power).
      Цитата Jin X @
      В моём понимании проблема в том, что мы не можем с уверенностью заявлять, то -0.2 = -1/5. Как ни прискорбно. Потому что это может быть -0.2000000000000000000000012345 или (наверное) -2/10, как кто-то выше говорил.
      Короче говоря, у меня только 1 мысль: встроить callback-функцию, которая будет вызывать юзерскую процедуру, а эта процедура уже будет решать что делать с этим безобразием...
      Плюс сделать ещё пару функций типа Root (корень нужной степени) и FracPower (где задаются X, P, Q, т.е. это комбинация Root и Power).

      Jin X, дружище! Не нужно путать теплое с мягким! Есть математика со своими правилами/законами, и есть исчисление на регистрах, со своими заморочками и ограничениями. Понятие "с этим безобразием" - означает только одно, ты не проработал "правила игры" в должной мере. Как правильно (математика) ты знаешь, как может быть (компьютерное представление и исчисление) - ты тоже знаешь. Задача простая - найти способ максимального соответствия. Предвижу вопрос "это ппц сложно", а кто сказал что должно быть просто?
        Надо просто написать отдельную функцию, которая возводит число не в целую или вещественную степень а в дробную (с явно заданными числителем и знаменателем показателя). Функция должна сократить получающуюся дробь и в зависимость от чётности знаменателя после сокращения выдать результат или сообщить об ошибке.

        Это куда практичнее, чем заставлять комп гадать, является ли переданное вещественное число представлением дроби 1/5, или оно просто случайно оказалось примерно равным 0.2.

        Можно даже использовать (написать) тип/класс для представления дроби, если так будет удобнее, в этом случае имеет смысл снабдить его всеми необходимыми операциями.
        В языках со статической типизацией это будет или перегруженная функция или функция обозначенная суффиксом (в Си есть функции pow и powi, пусть будет ещё и powfrac, например)
        В языках с динамической типизацией можно проверить тип показателя степени.
          Цитата amk @
          Функция должна сократить получающуюся дробь и в зависимость от чётности знаменателя после сокращения выдать результат или сообщить об ошибке.

          +1
            Эх, amk, есть, конечно, польза и мудрость в ваших словах, но простым людям это слишком излишне, запутано. Пишущий pow(-32,-0.2f) не станет гадать и посылать числитель со знаменателем! А число 0,2 в машине (сколько я прикидываю) действительно не так запишется, а с табуном нулей опосля 2: 0,20000000000***. Т.о., нужно поменять аж компилятор, дабы он понял, что записали -0,2 и постарался выдать те самые честные числитель со знаменателем!! Какая-то жесточайшая специфика=особенность возникает, - никто (думается) на таковое не пойдёт.
              Цитата amk @
              в Си есть функции pow и powi, пусть будет ещё и powfrac, например
              Так, я и говорю, что нужно сделать несколько функций: Power, Root и FracPower (или PowerFrac).

              Прикол просто в том, что обычно числа передаются как вещественные и могут быть результатом какого-то выражения. Этот случай тоже хотелось бы предусмотреть.
              Скажем, мы делаем калькулятор, юзер ввёл функцию (-2)^(3/7). Можно попытаться распознать выражение в скобках как дробь и использовать FracPower(-2, 3, 7), а можно использовать функцию PowerECB, которой мы будем передавать callback-функцию, разбивающую вещественное число на P и Q (по возможности). Единственное, что мне тут не нравится – это элемент случайности, т.е. если строить график функции (-2)^SIN(X), то функцию возможно будет вычислять "через раз" (или даже реже), т.к. во многих случаях результат типа 0.7642232323567763 вряд ли удастся представить с нечётным Q. И исходя из этого вся эта затея кажется абсурдной.

              Вообще, как я понимаю, во FracPower при X < 0 параметр Q должны быть целым и больше 0, так ведь (ведь не существует корней дробной, нулевой или отрицательной степени)? А вот P может быть любым. И при X > 0 значение Q может быть любым. Верно? :)
                Цитата Jin X @
                при X > 0 значение Q может быть любым. Верно?

                Ненулевым ;)

                Цитата Jin X @
                Вообще, как я понимаю, во FracPower при X < 0 параметр Q должны быть целым и больше 0, так ведь (ведь не существует корней дробной, нулевой или отрицательной степени)? А вот P может быть любым.

                Я так понял, что функция FracPower должна иметь сигнатуру (double,int,int). Тогда если X<0, то Q должно быть положительным и нечетным, либо при делении на НОД(P,Q) становиться нечетным.
                Цитата Jin X @
                функции (-2)^SIN(X)

                А она вообще определена на непрерывном множестве? Что-то мне подсказывает, что нет. :) Даже на комплексной плоскости.
                  Это у вас плохое предсказание. В комплексных числах она вполне нормально определена и ведёт себя (чрез экспоненту и логарифм распишите и увидите).
                  Вообще суть проблемы в том, что действительно операция (-2)y для вещественного результата - неустойчивая, т.е. малые изменения вполне способны бросать значения из действительного результата в комплексные.
                  Так что самым надёжным итогом будет написание функции:
                  Степень( число x, строка y) = xy,
                  чтобы анализировать запись 'y' и пытаться понять: искать ли вещ.корни, или их не бывает.
                    Цитата Славян @
                    А число 0,2 в машине (сколько я прикидываю) действительно не так запишется, а с табуном нулей опосля 2: 0,20000000000***. Т.о., нужно поменять аж компилятор, дабы он понял, что записали -0,2 и постарался выдать те самые честные числитель со знаменателем!!

                    Что то я не понимаю, а почему не округлить нужное число до второго знака, тем самым получив нужное число, без табуна нулей опосля 2?
                      Аппаратно нельзя. Особенность маш. представления чисел в x86.
                        Цитата KILLER @
                        почему не округлить нужное число до второго знака, тем самым получив нужное число, без табуна нулей опосля 2?

                        Потому, что там не только нули. Отрицательное число можно возводить в дробную степень, где целый числитель и целый нечётный знаменатель, типа 1/3, 2/7. Ни одно из таких чисел нельзя представить конечной двоичной дробью, но float или double представлены именно конечной двоичной дробью.
                          Цитата KILLER @
                          Что то я не понимаю, а почему не округлить нужное число до второго знака, тем самым получив нужное число, без табуна нулей опосля 2?
                          Так это и есть округлённое до второго (десятичного) знака число. Но не забывай, в компьютерах используется двоичное представление чисел, поэтому десятичные дроби не представимы точно. Почему, Mikle уже написал.
                          Цитата Славян @
                          Аппаратно нельзя. Особенность маш. представления чисел в x86.
                          Не только в x86. Этим страдают все аппаратные представления вещественных чисел.
                            Цитата amk @
                            Не только в x86. Этим страдают все аппаратные представления вещественных чисел.
                            Я убеждён, что в какой-нибудь машине сделали/делали не только расчёт в двоичной системе, но и в иных, и даже в десятеричной.
                              Сетунь считала в троичной. Калькуляторы считают преимущественно в десятичной.
                              Также в десятичной системе считали некоторые машины в 60-х, 70-х годах. Точнее в двоично-десятичной.
                              Сейчас недвоичных машин практически не осталось. Да и те выполняют роль скорее музейных экспонатов.
                                Погодите, а на чём Ява то считает? Их же тупой интерпретатор вполне способен скушать десятичное представление числа в записи строки pow(-32,-0.2) (или как у них там?) и выдать норм ответ!? Или просто решили забить?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0388 ]   [ 16 queries used ]   [ Generated: 28.03.24, 08:19 GMT ]