Представьте реальное число без потери точности


10

Текущая плавающая точка (ANSI C float, double) позволяет представить аппроксимацию действительного числа.
Есть ли способ представить реальные цифры без ошибок ?
Вот идея, которая у меня была, но она не идеальна.

Например, 1/3 - это 0,33333333 ... (основание 10) или o.01010101 ... (основание 2), но также 0,1 (основание 3).
Это хорошая идея для реализации этой "структуры":

base, mantissa, exponent

поэтому 1/3 может быть 3 ^ -1

{[11] = base 3, [1.0] mantissa, [-1] exponent}

Есть еще идеи?


12
Вы сможете представлять рациональные числа только таким образом.
Андрей Бауэр

Как вы предлагаете реализовать арифметические операции над числами в этом представлении? Используя логарифмы, чтобы изменить базу? Это было бы намного дороже, чем математика IEEE с плавающей точкой.
Дэвид Чжан

Ну, я понятия не имею. Я не инженер :) Очевидно, я не могу реализовать это аппаратно. Медленная, неэффективная реализация может быть сделана в C. Это будет просто эксперимент
incud

Ответы:


20

Все зависит от того, что вы хотите сделать.

Например, то, что вы показываете, является отличным способом представления рациональных чисел. Но это все еще не может представлять что-то вроде или идеально.πе

Фактически, многие языки, такие как Haskell и Scheme, имеют встроенную поддержку рациональных чисел, сохраняя их в форме где - целые числа.aбa,б

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

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

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


Могу я задать еще один вопрос? Если бы вы были инженером Intel в 80-х годах, как бы вы «спроектировали» свой формат реальных чисел?
Инк

3
Я не очень квалифицирован, чтобы ответить на это, так как я не инженер, я исследователь теории. Я не вижу ничего плохого в IEEE с плавающей запятой и двойных стандартах, а теперь и в квадрате. Я не думаю, что было много приложений, зависящих от более высокой точности арифметики, и те, которые действительно могут использовать программно-поддерживаемую версию.
jmite

Символическая алгебра не является правильным формализмом для точной вещественной арифметики. Вам нужно представление, которое позволяет сколь угодно большие мантиссы.
Андрей Бауэр

8
@AndrejBauer: произвольно большая мантисса не спасет вас, если вы хотите точное представление . 2
user2357112 поддерживает Монику

@jmite ты слишком скромный :)
incud

22

Невозможно представить все действительные числа без ошибок, если каждое число должно иметь конечное представление. Существует неисчислимо много действительных чисел, но только счетное количество конечных строк 1 и 0, которые вы могли бы использовать для их представления.


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

3
@kasperd Их называют вычислимыми реалами . К сожалению, такие вещи, как равенство, не вычислимы над вычислимыми вещественными числами.
Дэвид Ричерби

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

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

1
Возможно, технически это так, но это упускает из виду то, что существуют совершенно разумные бесконечные представления действительных чисел. И в этом нет ничего странного: TCP / IP-соединение, звонок в Skype или видеопоток с камеры - все это примеры (потенциально) бесконечного количества данных. Не существует априорного ограничения на объем информации, которую они могут предоставить. Существует только ограничение на количество информации, которое вы можете получить из нее за ограниченное время.
Андрей Бауэр

7

Ваша идея не работает, потому что число, представленное в базе с мантиссой m и показателем степени e, является рациональным числом b m - e , таким образом, ваше представление работает именно для рациональных чисел, а не для других. Вы не можете представлять бмебм-е например.2

Существует целая ветвь вычислимой математики, которая имеет дело с точной реальной арифметикой. Было предложено много структур данных для представления точных действительных чисел: потоков цифр, потоков аффинных сокращений, последовательностей Коши рациональных чисел, последовательностей Коши диадических рациональных чисел, разрезов Дедекинда, последовательностей интервалов сжатия и т. Д. Существуют реализации на основе точной действительной арифметики. на этих идеях, например:

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

Позвольте мне сделать замечание. Кто-то возразит, что бесконечный объект не может быть представлен компьютером. В каком-то смысле это правда, а в другом - нет. Нам никогда не нужно представлять целое действительное число, нам нужно только конечное приближениена каждом этапе расчета. Таким образом, нам нужно только представление, которое может представлять реальное с точностью до заданной точности. Конечно, когда у нас заканчивается компьютерная память, у нас заканчивается компьютерная память, но это ограничение компьютера, а не самого представления. Эта ситуация не отличается от многих других в программировании. Например, люди используют целые числа в Python и считают их «произвольно большими», хотя, конечно, они не могут превышать размер доступной памяти. Иногда бесконечность является полезным приближением для очень большого конечного числа.

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

В любом случае эту тему лучше всего заняться дальнейшим чтением.


+1, но я бы возразил, что вы не можете представить бесконечную строку с помощью конечного приближения без потери точности , как того требует вопрос. Конечно, вы можете получить столько точности, сколько захотите - насколько вы можете приблизиться с помощью рационального - но это не совсем то, о чем просит вопрос. Возможно, это проблема с вопросом, а не с ответом.
Дэвид Ричерби

2
Дело в том, что мы не представляем конечными строками. Мы представляем бесконечные строки, но нам нужна только конечная часть такой бесконечной строки на каждом этапе вычислений. Или, другими словами, нет потери точности, поскольку структура данных содержит всю информацию, но, конечно, вы не можете получить доступ или обработать всю информацию сразу: структура данных дает вам столько точности, сколько вы просите , Узкое место находится не на стороне структуры данных, а скорее на стороне «потребителя», который хочет извлечь из него информацию.
Андрей Бауэр

@AndrejBauer Но в некоторых случаях вы должны получать доступ или обрабатывать всю информацию сразу, например, именно так и поступают символьные вычисления, фиксируя «сущность» или природу величины, а не просто любой другой поток цифр. Если вы скажете пакет символьных вычислений, чтобы убедиться, что , это немедленно выведет истину. Если вы использовали описанный вами метод, взяв первыеkцифр квадратного корня из2, длялюбогоkвы придете к выводу, что22знак равно2К2 Кпоскольку ваш результат (для любого конечногоk) будет равен1,99 ..., неправильный ответ. Вычисления конечны. 222К1,99 ...
Томас

2
@Thomas: символьные вычисления не представляют действительные числа, но обычно это какое-то подполе вещественных чисел, обычно это поле, генерируемое элементарными функциями и корнями полиномов. Эти подполя не являются полными (замкнутыми в пределах последовательностей Коши) и вычислимо полными (замкнутыми в вычислимых пределах последовательностей Коши). Представление не является представлением вещественных чисел, если вы не можете представить все (вычислимые) действительные значения: и символические вычисления не выполняют это условие.
Андрей Бауэр

1
Эти замечания о счетности не имеют значения, потому что вычислимые вещественные числа не являются вычислимо счетными.
Андрей Бауэр

7

Существует много эффективных реализаций Rational Number, но одна из них, которая была предложена много раз и может даже хорошо обрабатывать некоторые иррациональные числа, - это Continued Fractions .

Цитата из продолжения фракций Даррена Коллинза :

Теорема 5-1. - Длительное выражение дроби действительного числа конечно тогда и только тогда, когда действительное число рационально.

Цитата из Mathworld - периодические дроби

... непрерывная дробь периодична, если она является корнем квадратичного полинома.

т.е. все корни могут быть выражены как периодические непрерывные дроби.

Существует также Точная Продолженная Фракция для π, которая удивила меня, пока @AndrejBauer не указал, что на самом деле это не так.


ππ

Непрерывное дробное представление вещественных чисел было предложено в качестве реализации точной реальной арифметики некоторое время назад Дж. Вуйеменом. Оказывается, это не очень эффективно, так как цифры довольно быстро становятся довольно большими, и их размер трудно сократить.
Андрей Бауэр

Непрерывные дроби имеют некоторые вычислительные проблемы даже для представления рациональных чисел - хотя их можно сравнительно быстро сравнивать с использованием варианта лексикографического порядка, и хотя манипулировать одной непрерывной дробью легко, и сложение (и двоичное) сложения и умножения на CF являются довольно сложными операциями. воплощать в жизнь.
Стивен Стадницки,

5

В комментариях есть ряд «точных реальных» предложений (например, непрерывные дроби, линейные дробные преобразования и т. Д.). Типичный улов в том, что, хотя вы можете вычислить ответы по формуле, равенство часто неразрешимо.

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

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

Обратите внимание, что проблема NP-трудна, потому что она включает SAT. Тем не менее, неизвестно (или не считается) быть в NP.

РЕДАКТИРОВАТЬ Я собираюсь попытаться объяснить это немного больше.

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

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

Есть много интересных теорий, выраженных в рамках SMT. Например, существуют теории структур данных (например, списки, двоичные деревья и т. Д.), Которые используются для доказательства правильности программ, и теория евклидовой геометрии. Но для нашей цели мы смотрим на теории разных видов чисел.

Пресбургерская арифметика - это теория натуральных чисел с сложением. Эта теория разрешима.

Арифметика Пеано - это теория натуральных чисел с сложением и умножением. Эта теория не является разрешимой, как это доказал Гедель.

Арифметика Тарского - это теория действительных чисел со всеми полевыми операциями (сложение, вычитание, умножение и деление). Интересно, что эта теория разрешима. Это был очень нелогичный результат в то время. Вы можете предположить, что, поскольку это «надмножество» натуральных чисел, это «сложнее», но это не так; например, сравнивать линейное программирование для рациональных чисел с линейным программированием для целых чисел.

Может показаться неочевидным, что удовлетворение - это все, что вам нужно, но это так. Например, если вы хотите проверить, равен ли положительный квадратный корень из 2 реальному кубическому корню из 3, вы можете выразить это как проблему выполнимости:

Икс,Икс>0Икс2-2знак равно0Икс3-3знак равно0

еИкс

грех{Иксπ|грехИксзнак равно0}грех

еИксеяИкс


Альфред Тарский (1948) . Метод решения элементарной алгебры и геометрии .


2

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

πе


ееяИксгрехсоз{Икср|грехИксзнак равно0}

@ Псевдоним Это кажется действительно интересным, но я не думаю, что у меня есть математические знания, чтобы понять это правильно ... Что вы подразумеваете под "достаточно близко к целым числам"?
Больше осей

Я собираюсь изменить свой ответ, чтобы объяснить.
псевдоним

1

π2


Этот ответ неверен. Существует целая область точной реальной арифметики, которая объясняет, как представлять реалы с помощью компьютеров. Предположение, что действительное должно быть представлено конечной строкой, ошибочно. Мы также можем использовать бесконечные строки. Алан Тьюринг уже писал об этом в своей первой статье, в которой он изобрел машины Тьюринга!
Андрей Бауэр

Можете ли вы дать ссылку на статью о том, как хранить бесконечные строки на реальном компьютере и манипулировать ими, потому что это будет ответом на вопрос. Кроме того, это была не его первая статья, первая публикация была в 1936 году, эта статья была в 1937 году.
Установка

Вы правы, это статья 1937 года. Чтобы увидеть, как манипулируют бесконечными строками, вы можете, например, взглянуть на протокол TCP / IP. Я никогда не говорил, что все настоящее должно храниться в компьютере.
Андрей Бауэр

-1

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


Это снова ложный ответ, полученный из невежества. Существует целая область точной реальной арифметики, которая изучает, как представлять все вещественные числа с помощью подходящих структур данных.
Андрей Бауэр

@AndrejBauer Итак, вы предполагаете, что существует структура данных, которая может представлять любое действительное число? Любая такая структура данных должна была бы использовать бесконечное количество битов для представления любого числа.
Алиса Рюль,

1
Счетное количество битов хватает, в первую очередь, и так как вам не нужно их все сразу, и вы в состоянии обработать их все сразу, они могут быть сохранены во времени, и в пространстве.
Андрей Бауэр

@AndrejBauer Этот ответ правильный и говорит то же самое, что и ваш, хотя и с гораздо меньшим количеством информации. Вы не можете представить все действительные числа в компьютере. Вы можете представить любое действительное число, но не все сразу. Во всяком случае, я бы оспорил, что вы можете представлять «многие», так как вы можете представлять только конечное число в любом данном компьютере и только почти ни одно (в математическом смысле) в абстрактном компьютере, который эквивалентен обычным моделям вычислений (Тьюринга). машинный эквивалент).
Жиль "ТАК ... перестать быть злым"

-1

Можно точно представить любое число, где входные данные представимы, сохраняя их как строку операций, так что, например, вы сохраняете 1/3как 1 divided by 3, обрабатывая отмену операций, вы можете упростить следующую операцию, чтобы получить точный ответ (1/3) * 3. Это также может справиться с ситуациями, когда вы знаете иррациональные числа, например π, сохраняя их в своих вычислениях.

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


5+26-2знак равно3

Верно. На самом деле, это, вероятно, фактически невозможно полностью успешно автоматизировать. Однако результат остается точным, даже если вы не использовали простейшее из возможных представлений.
Джек Эйдли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.