Обновить

Комментарии 47

Подход типичный, но он не работает.

Вы говорите, что у Вас обычный 0 представляется как 1/A. Но тогда возникает вопрос: чему равно 1 - 1, или A - A. Предположу, что A^-1 и A^0 соответственно.

Но тогда:

\frac{42A^{-2} + 1 - 1}{A^{-2}} = A

Что очевидно глупость. И я уже не говорю про2-2...

Второй вопрос, по Вашей реализации уже. Вы, зачем-то, отсекаете нижние уровни — этого делать нельзя. Типовой пример:

\frac{\sqrt{1 + xA^{-10}} - 1}{A^{-10}}

Я ожидаю увидеть в ответе\frac12 x, но Ваша библиотека выдаст что-то другое.

Ну и в целом, в любой адекватной числовой системе0необратим — иначе мы потеряем дистрибутивность/ассоциативность. А без дистрибутивности/ассоциативность никакие числа не нужны... (Ну ладно флоаты как-то живут — но разве это жизнь)

Да, точно, спасибо за внимательность! Надо исправить и первое и второе замечание совершенно верны.

Как уже сказал, это нельзя исправить

1 можно попробовать ввести абсолютный ноль(как я этого не хотел), видимо без него не обойтись.
2) для второго можно не отсекать уровни, хранить как полином до n-уровня, правда это замедлит всё..
Как думаете?

1) Отличный вопрос! "A" это не число, даже не очень большое число, это что-то где-то в бесконечности, поэтому в этой системе log(A) подразумевается таким же как log(∞) в классической системе , но какой ∞ точнее A будет, логарифмирование и извлечение корней пока не реализовывал.
2) Но вот по корням второй степени из А первой степени, как частного случая появления дробного корня, у меня было два варианта развития развития ситуации, введение степеней с плавающей точкой, но сейчас склоняюсь к тому что через static переменную фиксировать то в какую степень возводили и какую извлекали числа, ведь по логике А это общий ориентир для всей модели.. а корень любой(конечной) степени из бесконечности это бесконечность, тут надо ещё подумать и поэкспериментировать..

Так не выйдет. Например для любогоnверно

1 + \frac{A \log^n A}{A^2} = 1 + \epsilon

Где\epsilonкакая-то величина меньшая по порядку чемA^0.

То есть, если\log A = A^\delta, то достаточно взятьn \ge \frac2\deltaи "нормальная" логика сломается.

Ну и Вы не ответили на вопрос с корнем. Ну или даже ещё проще: чему равно

\frac1{1 + A}

?

Да вы абсолютно правы, пока в текущей системе нельзя корректно определить log(A)я думаю реальный и честный вариант пока, это ограничить его использование в пределах регулярных чисел, с корнем ответил выше

\frac1{1 + A}

в этой реализации это будет 1/(A + 1) = 1×A⁻¹ - 1×A⁻² + 1×A⁻³ или 0 в обычной системе.

Забыли +1.

Такой результат начнёт врать если к этому выражению прибавить полином 3-го порядка — так называемое "катастрофическое сокращение"

Не понял про +1 и про "катастрофическое сокращение" тоже не понял, можно пояснить?

Если мы из

\frac1{1+A}

Вычтем

 1 - A + A^{-2} - A^{-3} - 42A^{-4}

То хотелось бы получить

43A^{-4}

А не 0.

если правильно, то получим -42A(-4) а хотелось бы 43) эмулировать бесконечный ряды тоже можно но нужно ли.. если и то и другое для конечного пользователя это 0 например..

Ну, можно потом результат разделить наA^{-4}и уже будет не 0. В работе с бесконечностями всегда можно прощупать скольугодно малые колебания.

В данной системе катастрофического сокращения не может быть, тут "A" - не число, числа на разных уровнях не могут суммироваться но про +1 всё равно не понял)

Так я их и не вычитаю. Вопрос в том, что у Вас не хранится информация о коэффициенте приA^{-4}. Поэтому при вычитании разных чисел может получится 0 — это и называется "катастрофическое сокращение" (не в смысле IEEE 754, а в обобщённом смысле, если хотите).

Перечитайте ещё раз чему равна дробь. У Вас получается, что 1/1 = 0. Там член прогрессии пропустили

нет я ничего не пропустил, 1/(A + 1)  это 1/(1 + ∞ ) это 1×A⁻¹ - 1×A⁻² + 1×A⁻³ в предложенной системе 0 в обычной..

А, действительно. Это я перепутал. Ну тогда в выкладках выше нужно немного поправить вычитаемый многочлен.

P.S. обычно определяют не "бесконечность", а "бесконечномалую" — впрочем это двойственные понятия.

Так корень же может быть как снаружи так и внутри. Например, чему равно:

\sqrt{\sqrt{1 - xA} - 1 - \frac12 x A}

Я Вам могу ещё долго таких "каверзных" примеров накидывать.

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

Ввиду своих ограничений данные подходы тяжело сделать общеприменимыми. Поэтому живут либо на флоатах, либо вообще избегают вещественных чисел.

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

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

Вернуть NaN всегда можно, да. Но тогда зачем всё это? Чем обычные флоаты не угодили :)

Попробуйте сформулировать задачу, которую Ваша библиотека пытается решить. Я пока не очень понимаю её скоуп/применимость.

А ну вот) конкретно мне понравилась идея чтобы в расчётах сложнозамкнутых произвольно коммутируемых сетей не перестраивать при каждой коммутации граф, а просто заменит 0 на ∞  и наоборот... конечно у меня там нет необходимости в логарифмах и вложенных корней произвольной размерности, поэтому всё работает даже на одном слое..

А, ну тогда Вы придумали (гипер)дуальные числа.

Впрочем идея может и красивая, но перестраивать граф, скорее всего, гораздо эффективнее. Хотя зависит от деталей задачи.

я находил, что это альтернативный анализ с манадами и тп

Не совсем. Это чисто вычислительный трюк, чтобы работать с бесконечномалыми на компьютере.

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

Гипердуальные числа есть просто обобщение на другие степени. Например, можете рассматривать числа вида:

x_1 + x_2 d + x_3 A

Где d — означает бесконечномалую, а A — плюс бесконечность. Дальше осталось ввести только таблицу умножения, например:

A^2 = A \quad d^2 = 0 \quad Ad = 1

Тогда в определённых пределах такие числа будут давать корректные результаты. А если заменитьA^2на NaN/исключение, то она даже будет предсказуемой.

Подразумевается, разумеется, что данные числа определены с точностью доo(d). Можно также хранить признак, является ли число "точным", или же там есть o-малое. Тогда можно будет отличать ситуации деления на 0.

Tl;Dr; Если не замахиваться на универсальность, можно достичь хороших результатов с гораздо более простым представлением чисел (и для него будет проще определить границы применимости)

вот здесь есть не только каверзный пример (из моей статьи маленько на другую тему), но и имеющий большое практическое значение, потому как LDPC коды много где применяются. Я как раз не проанализировал до конца +-бесконечности в LLR-ах, потому как заработало и без этого.

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

Возможно Вы правы, но изобретать велосипед нам никто не может запретить))

Подход типичный, но он не работает

Какие-то пустяки на самом деле. Весь современный www держится на технологии, где в теории все сломано. Но он работает.

Скрытый текст

Не знаю зачем автор выбрал C++. Многомерную математику нужно сразу писать на JavaScript. /s

Так на практике и флоаты работают. Зачем тогда подход автора?/s

Спасибо)

Проблема, которая решается, неясна. Какой бы результат ни приписать операции деления на ноль, это не сделает это деление осмысленным.

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

Пишите "о" в слове "ноль", там где ударение на первый слог и "у" там, где нет ударения: "нулём", "нулевой", и никогда не ошибётесь. Исключение: выражение "подстричь под нуль"

Благодарю!

мне кажется лучше не делить на 0 всё таки, это безопасно, я последнее время думаю 0 это начало координат для единичных отрезков

Ну я всё таки пока склоняюсь к тому что можно делить, хотя под руководством чётких правил, поэтому и появилась попытка родить в опенсорсе библиотеку для этого..

Решили 1 проблему - создали миллион. Ваши числа даже сложить нельзя... не говоря о log и exp

Приведите пожалуйста пример, что не получилось сложить? В области регулярных чисел всё должно работать и с log и exp. если есть примеры приведите их пожалуйста

В области регулярных чисел всё должно работать и с log и exp

Кстати об этом. Чему равно\exp(10000)? Это уже из области реализации, но вопрос в том, как Ваши числа взаимодействуют с флоатами

Преобразование многоуровневых чисел в стандартный флоат: если число находится на нулевом уровне, то возвращается флоат(double) старшего члена, если уровень выше ноля, то STL-евский INF или -INF в зависимости от знака старшего члена, если же, уровень ниже ноля, то double 0. Математические функции: log, exp и другие, используют STL реализацию с предварительным приведением к флоату, для тригонометрических функций выкидывается исключение для бесконечного аргумента.

Тут опять же нарушается логика. Например,

\exp(2x) - \exp(x) = 0

Для достаточно большихx- например дляx = 10000.

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

По хорошему, Вам нужно сначала сформулировать какими свойствами должны обладать Ваши операции. В идеале, хочется что-то типа аксиом поля. Но честного поля у Вас не получится, т.к. флоаты уже им не удовлетворяют. Но можно строить более слабые аналоги: например можно затребовать чтобыd((x + y) + z, x + (y + z)) < \epsilon(x, y, z)для какого-то разумного выбора функции\epsilonи для любыхx, y, zиз какого-то достаточно большого множества. И так с остальными аксимомами.

Дальше нужно посмотреть а следует ли из заданных аксиом ожидаемое поведение. Посмотреть на практические задачи и как в них себя ведут эти аксиомы.

Если всё устраивает, то нужно доказать выполнение заданных аксиом для всех операций. И в целом, поведение операций нужно выбирать очень аккуратно, постоянно сверяясь с аксиомами.

И вот эти вот аксиомы/теоремы - это неотъемлимая часть документации. Именно их нужно выписывать в статье. Без них пользоваться библиотекой/подходом невозможно. Просто потому что никогда не знаешь, когда он начнёт врать =/

В целом вы правы, нужно чётко разделить концепт от реализации, и прописать это в документации и конечно в статье.

Тут опять же нарушается логика

В части концептуальной идеи логика нарушается, в части реализации на любом float логика соответствует логике float, если число ограничено то его переполнение приводит к появлению INF и как раз поэтому считаю логичным поведение многослойных чисел конкретно на этом примере. Да, конечно, это нужно отдельно указывать в документации.

Вы сейчас пытаетесь на скорую руку залатать концепцию

Отнюдь, я сейчас собираю максимально подробный фидбэк.

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

Да, тут и далее вы правы на 100%

в части реализации на любом float логика соответствует логике float

Если тот же пример вычислить во флоатах, то получится NaN/ошибка. В этом и несоответствие

Поймите меня правильно, без конкретных примеров трудно решать проблему, это всё таки Opensource библиотека, и пока, я один в неё вовлечён, для того чтоб найти "Ваши числа даже сложить нельзя... " уйдут годы. Конкретно мои числа все складываются без ошибок. Многоуважаемый @cpud47, дал хоть и спорные, но развёрнутые и чёткие замечания, настолько чёткие, что ему можно смело присвоить соавтора, у Вас пока не понятное замечание, больше похожее на плевок..

Ваши числа даже сложить нельзя

Да вроде всё тот же пример:1 + (-1). У Вас в статье всё ещё не отражено наличие нуля.

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

Пора смериться...

Это юмор такой про измерения линейкой? Или ошибка?

"смИриться" вообще-то, от слова "смирение".

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации