Представляти дійсне число без втрати точності


10

Струм з плаваючою комою (ANSI C з плаваючою точкою, подвійний) дозволяють уявити наближення дійсного числа.
Чи є спосіб представити реальні числа без помилок ?
Ось у мене виникла ідея, яка є все, але не ідеальною.

Наприклад, 1/3 - це 0,33333333 ... (база 10) або o101010101 ... (база 2), але також 0,1 (база 3)
Чи корисно реалізувати цю "структуру":

base, mantissa, exponent

тому 1/3 може бути 3 ^ -1

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

Будь-які інші ідеї?


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

Як ви пропонуєте реалізувати арифметичні операції над числами в цьому поданні? Використовуючи логарифми для зміни бази? Це було б набагато дорожче, ніж математика IEEE з плаваючою комою.
Девід Чжан

Ну, я не маю уявлення. Я не інженер :) Очевидно, я не можу реалізувати це в апаратному забезпеченні. Повільна, неефективна реалізація може бути здійснена в C. Це був би лише експеримент
включити

Відповіді:


20

Все залежить від того, що ви хочете зробити.

Наприклад, те, що ви показуєте, - це чудовий спосіб представлення раціональних чисел. Але він все ще не може представляти щось на кшталт або e ідеально.πe

Насправді багато мов, таких як Haskell і Scheme, створили підтримку раціональних чисел, зберігаючи їх у вигляді деa,bцілі числа.aba,b

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

Відомо, що деякі реальні числа є незрівнянними, як-от зупинки чисел . Немає алгоритму, що б перерахував його цифри, на відміну від , де ми можемо обчислити n- й цифру, поки будемо чекати досить довго.πn

Якщо ви хочете реальної точності до ірраціональних чи трансцендентальних чисел, вам, ймовірно, доведеться скористатися якоюсь системою символічної алгебри, а потім отримати остаточну відповідь у символічній формі, яку ви можете наблизити до будь-якої кількості цифр. Однак, з огляду на проблеми нерозбірливості, описані вище, цей підхід обов'язково обмежений. Це все ще добре для таких речей, як наближення інтегралів чи нескінченних рядів.


Чи можу я задати ще одне запитання? Якби ви були інженером Intel у 80-х, як би ви «спроектували» свій реальний формат чисел?
включно

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

Символічна алгебра - це не правильний формалізм для точної реальної арифметики. Вам потрібно представництво, яке дозволяє довільно великі мантіси.
Андрій Бауер

8
@AndrejBauer: як завгодно великий мантиса не збирається врятувати вас , якщо ви хочете точне уявлення . 2
user2357112 підтримує Моніку

@jmite ти занадто скромний :)
включно

22

Немає можливості представити всі дійсні числа без помилок, якщо кожне число має мати кінцеве подання. Існує незліченна кількість реальних чисел, але лише незліченна кількість кінцевих рядків 1-х та 0-х, які можна використати для їх представлення.


Можна обмежити вимогу від представлення кожного реального числа лише обмеженням тих реальних чисел, які можуть бути результатом роботи машини. Це було б лише лічильне число реальних цифр, але все одно охоплювало б кожне число, яке ви хотіли б представляти. Але я не думаю, що ви могли б робити ефективні обчислення з такими числами.
kasperd

3
@kasperd Їх називають обчислюваними реалами . На жаль, такі речі, як рівність, не підлягають обчисленню через обчислювані цифри.
Девід Річербі

Дійсно цілком зрозуміло, що обчислення рівності на таких числах рівнозначне вирішенню проблеми зупинки. Враховуючи TM, можна визначити реальне число, яке починається з безлічі десяткових знаків, рівних стільки, скільки триває час роботи TM, а потім - число. Порівнювати це число з нулем еквівалентно вирішенню проблеми зупинки для вихідної TM.
kasperd

Ця відповідь хибна. Алан Тьюрінг у своєму першому документі про машини, ті, в яких він винаходить машини Тьюрінга, розповідає про представлення даних як нескінченних рядків даних. Це призводить до ідеї так званої "машини Тюрінга типу II", і існує дуже вдала теорія обчислення реальних чисел, заснована на ідеї. Це також реалізується на практиці, дивіться мою відповідь.
Андрій Бауер

1
Можливо, це робиться технічно, але він пропускає суть, яка полягає в тому, що існує цілком розумні нескінченні уявлення реальних чисел. І це нічого дивного: TCP / IP-з'єднання, або виклик Skype, або відео-канал із камери - все це приклади (потенційно) нескінченної кількості даних. Не існує апріорного обмеження щодо кількості інформації, яку вони можуть надати. Існує лише обмеження щодо кількості інформації, яку ви можете отримати з неї за обмежений час.
Андрій Бауер

7

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

Існує ціла галузь обчислювальної математики, яка займається точною реальною арифметикою. Запропоновано багато структур даних для відображення точних реальних чисел: потоки цифр, потоки афінних скорочень, послідовності Коші раціоналів, послідовності Коші діадічних раціоналів, розрізи Дедекінда, послідовності інтервалів скорочення і т.д. щодо таких ідей, наприклад:

З них iRRAM є найбільш зрілим і ефективним. Маршалл в експериментальному проекті, тоді як третій - студентський проект, але також найбільш легко доступний. У ньому є дуже приємне вступ, в якому пояснюються питання щодо обчислення реальних чисел, я дуже рекомендував вам поглянути на це.

Дозвольте зробити зауваження. Хтось заперечить, що нескінченний об’єкт не може бути представлений комп'ютером. У деякому сенсі це правда, але в іншому це не так. Нам ніколи не доводиться представляти ціле дійсне число, нам потрібне лише кінцеве наближенняна кожному етапі обчислення. Таким чином, нам потрібно лише представлення, яке може представляти реальну до будь-якої заданої точності. Звичайно, коли у нас не вистачає пам'яті комп'ютера, у нас залишається пам'ять комп’ютера, але це обмеження комп'ютера, а не самого представлення. Ця ситуація не відрізняється від багатьох інших в програмуванні. Наприклад, люди використовують цілі числа в Python, і вони вважають їх "довільно великими", хоча, звичайно, вони не можуть перевищувати об'єм доступної пам'яті. Іноді нескінченність є корисним наближенням для дуже великого кінцевого числа.

Крім того, я часто чую твердження, що комп'ютери можуть мати справу лише з обчислюваними реальними числами. У цьому пропущено два важливі моменти. По-перше, комп'ютери мають доступ до даних із зовнішнього світу, тому нам також доведеться зробити (неперевірене) припущення, що зовнішній світ також обчислюється. По-друге, нам потрібно розрізняти, які реальні можливості комп'ютер може обчислити, і те, що він може представляти. Наприклад, якщо ми вибираємо потоки цифр як представлення дійсних даних, то цілком можливо представити невичислимий реальний: якби хтось дав нам це, ми б знали, як його представити. Але якщо ми вирішимо представляти реалі як фрагменти вихідного коду, які обчислюють цифри, то, очевидно, ми не могли б представляти не обчислювані цифри.

У будь-якому випадку цю тему найкраще вирішувати ще одним читанням.


+1, але я заперечую, що ви не можете представляти нескінченну рядок за допомогою кінцевого наближення, не втрачаючи точності , як цього вимагає запитання. Звичайно, ви можете отримати стільки точності, скільки хочете - наскільки можна, шляхом наближення раціональним - але це не зовсім те, що запитання задається. Можливо, це вже проблема, а не відповідь.
Девід Річербі

2
Справа в тому, що ми не представляємося з кінцевими рядками. Ми представляємо нескінченними рядками, але нам завжди потрібна кінцева частина такої нескінченної струни на кожному етапі обчислення. Або , іншими словами: не існує НЕ втрата точностей, оскільки структура даних містить всю інформацію, але, звичайно , ви не можете отримати доступ або обробляти всю інформацію відразу: структура даних дає вам такою ж точністю , як ви просите . Вузьке місце не на стороні структури даних, а на стороні "споживача", який хоче отримати інформацію з неї.
Андрій Бауер

@AndrejBauer Але ви повинні отримати доступ або обробити всю інформацію відразу в деяких випадках, наприклад, це робиться символічним обчисленням, фіксуючи "сутність" або характер кількості, а не як будь-який інший потік цифр. Якщо ви скажете пакет символічних обчислень, щоб перевірити це , це миттєво виводить істину. Якщо ви використовували метод, який ви, схоже, описуєте, беручи першіkцифр квадратного кореня2, длябудь-якогоkви зробите висновок, що22=2k2 kоскільки ваш результат (для будь-якого кінцевогоk) дорівнює1,99 ..., неправильна відповідь. Розрахунки кінцеві. 222k1.99...
Томас

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

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

7

Існує багато ефективних реалізацій раціональних чисел, але одна пропозиція, яка була запропонована багато разів і навіть може досить добре впоратися з деякими ірраціоналами, - це « Продовження дробів» .

Цитата з продовжених дробів Даррена К. Коллінза :

Теорема 5-1. - Вираження тривалого дробу реального числа є кінцевим, якщо і лише тоді, коли дійсне число раціональне.

Цитата з Mathworld - Періодичні дроби, що тривають

... продовження дробу є періодичним, якщо вона є коренем квадратичного многочлена.

тобто всі корені можна виразити як періодичні тривалі дроби.

Існує також точна фракція, що триває для π, що мене здивувало, поки @AndrejBauer не зазначив, що насправді це не так.


Ваше останнє речення вводить в оману. Не існує кінцевої (або періодичної) тривалої фракції для . Продовжена фракція при π нескінченна і аперіодична. ππ
DW

Продовження подання фракцій дій було запропоновано як реалізацію для точної реальної арифметики деякий час тому Дж. Вульєміном. Це виявляється не дуже ефективним, оскільки кількість людей стає досить великою, і важко скоротити їх розмір.
Андрій Бауер

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

5

У коментарях є ряд "точних реальних" пропозицій (наприклад, тривалі дроби, лінійні дробові перетворення тощо). Типовий улов полягає в тому, що, хоча ви можете обчислити відповіді на формулу, рівність часто не можна визначити.

Однак, якщо вас просто цікавлять алгебраїчні числа, то вам пощастить: Теорія реальних закритих полів повна, не мінімальна та рішуча. Це довів Тарскі в 1948 році.

Але є улов. Ви не хочете використовувати алгоритм Тарскі, оскільки він знаходиться в класі складності НЕЗАЛЕМНИЙ, який настільки ж непрактичний, як і непрактичні алгоритми. Існують новітні методи, які знижують складність до DEXP, це найкраще, що ми знаємо на даний момент.

Зауважте, що ця проблема є NP-важкою, оскільки вона включає SAT. Однак невідомо (чи вважали), що опинився в НП.

EDIT Я спробую пояснити це трохи більше.

Основою для розуміння всього цього є проблема рішення, відома як Теорія модуля задоволеності, або коротше SMT. В основному ми хочемо вирішити SAT для теорії, побудованої на основі класичної логіки.

Тож ми почнемо з класичної логіки першого порядку з тесту на рівність. Які функціональні символи ми хочемо включити і які їх аксіоми визначають, чи можна визначити теорію чи ні.

Є багато цікавих теорій, висловлених у рамках SMT. Наприклад, існують теорії структур даних (наприклад, списки, двійкові дерева тощо), які використовуються для підтвердження правильності програм та теорії евклідової геометрії. Але для нашої мети ми розглядаємо теорії різних видів чисельності.

Арифметика Пресбургера - це теорія натуральних чисел з додаванням. Ця теорія є рішучою.

Арифметика піано - це теорія натуральних чисел з додаванням і множенням. Ця теорія не є рішучою, як це добре показало Гедель.

Арифметика Тарського - це теорія дійсних чисел з усіма польовими операціями (додавання, віднімання, множення та ділення). Цікаво, що ця теорія є рішучою. На той час це був дуже контр-інтуїтивний результат. Ви можете припустити, що тому, що це "надмножина" натуральних чисел, "важче", але це не так; порівняйте, наприклад, лінійне програмування над раціональними та лінійне програмування на цілі числа.

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

x.x>0x22=0x33=0

ex

sin{xπ|sinx=0}sin

exeix


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


2

Можна зобразити дуже великий клас чисел, які називаються алгебраїчними числами , трактуючи їх як коріння многочленів.

πе


eeixsincos{xR|sinx=0}

@ Псевдонім Це здається дійсно цікавим, але я не думаю, що я маю математичну основу, щоб правильно його зрозуміти ... Що ви маєте на увазі під "достатньо близьким до цілих чисел"?
Більше Сокир

Я збираюся виправити свою відповідь, щоб пояснити.
Псевдонім

1

π2


Ця відповідь хибна. Існує ціла область точної реальної арифметики, яка пояснює, як представляти реали комп'ютерами. Припущення про те, що реальне має бути представлене кінцевим рядком, є помилковим. Ми також можемо використовувати нескінченні рядки. Вже Алан Тьюрінг писав про це у своєму першому документі, тому, де він винайшов машини Тьюрінга!
Андрій Бауер

Чи можете ви посилатись на документ про те, як зберігати та маніпулювати рядками безперервного запису на фактичному комп’ютері, оскільки це буде відповіддю на запитання Крім того, це не було його першим документом, перша публікація була 1936 р., Що документ був 1937 р.
lPlant

Ви маєте рацію, що це документ 1937 року. Щоб побачити, як нескінченно обробляються рядки, ви можете, наприклад, подивитися на протокол TCP / IP. Я ніколи не казав, що весь реальний повинен зберігатися в комп’ютері.
Андрій Бауер

-1

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


Це знову ж помилкова відповідь, отримана з незнання. Існує ціла область точної реальної арифметики, яка вивчає, як представити всі випробування відповідними структурами даних.
Андрій Бауер

@AndrejBauer Отже, ви припускаєте, що існує структура даних, яка може представляти будь-яке реальне число? Будь-яка така структура даних повинна використати незліченну нескінченну кількість біт, щоб представити будь-яке число.
Аліса Риль

1
Зліченна кількість бітів вистачає, в першу чергу, і так як вам не потрібно їх все відразу, і ви в змозі обробити їх все відразу, вони можуть бути збережені в часі, і в просторі.
Андрій Бауер

@AndrejBauer Ця відповідь правильна і говорить те саме, що і ваша, хоча і з набагато меншою кількістю інформації. Ви не можете представити всі реальні числа на комп'ютері. Ви можете представляти будь-яке реальне число, але не все відразу. Якщо б щось не було, я заперечу, що ви можете представляти «багато», оскільки ви можете представляти лише кінцево багато в будь-якому комп’ютері, і лише майже жодне (в математичному сенсі) на абстрактному комп'ютері, що еквівалентно звичайним моделям обчислень (Тьюрінг машинний еквівалент).
Жил 'ТАК - перестань бути злим'

-1

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

Однак для цього потрібно збільшувати об'єм пам'яті для кожного номера і - якщо припустити, що ваш спрощувач не є ідеальним - можливо, знадобиться постійно збільшуватися кількість значень, над якими ви багато працюєте.


5+262=3

Справді. Насправді, напевно, неможливо повністю успішно автоматизуватися. Однак результат залишається точним, навіть якщо ви не використовували найпростіше можливе подання.
Джек Едлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.