Чому номери з плаваючою комою часто використовуються в науці / техніці?


33

Досліджуючи точність чисел з плаваючою комою, я десь бачив вислів, подібний до

" float і double" ( призначені для / часто використовуються в ) інженерно-науковому розрахунку "

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

Я відчуваю, що майже розумію цю відповідь

"числа з плаваючою комою дозволяють моделювати безперервні величини"

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

Чи може хтось розширити це пояснення і, можливо, навести приклад?



47
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.І в науці, і в техніці ви дбаєте лише про точність до певного моменту. Використання нескінченної точності для кожного розрахунку часто буває зайвим. Що відрізняє плаваючу крапку від фіксованої точки, це те, що вам не потрібно вводити певну кількість десяткових знаків - у вас можуть бути дійсно невеликі величини з великою кількістю десяткових знаків або дійсно великі величини з обмеженою точністю.
Доваль

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

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

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

Відповіді:


77

Розрахунки в галузі науки та техніки вимагають компромісів у точності, дальності та швидкості. Арифметика з фіксованою точкою забезпечує точність та пристойну швидкість, але приносить в жертву дальність. BigNum, довільні бібліотеки точності, виграють на дальності та точності, але програють на швидкості.

Суть у тому, що більшість наукових та інженерних розрахунків потребують великої швидкості та величезного дальності, але мають відносно скромні потреби в точності. Найбільш добре визначена фізична константа відома лише приблизно 13 цифрам, і багато значень відомі з набагато меншою визначеністю. Маючи на комп'ютері більше 13 цифр точності, це не допоможе. Муха в мазі полягає в тому, що послідовності операцій з плаваючою точкою можуть поступово втрачати точність. Хліб і масло чисельного аналізу з'ясовують, які проблеми особливо сприйнятливі до цього, і з'ясовують розумні способи перестановки послідовності операцій для зменшення проблеми.

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


2
Гарна відповідь. Хоча основні функції можуть бути абсолютно безперервними, що вимагало б ідеальної точності, щоб точно моделювати, реальність полягає в тому, що все в науці та техніці - це наближення. Ми швидше матимемо пристойні, корисні наближення і досягнемо чогось, ніж нескінченна точність, для якої ми б чекали вічно, коли багато операцій завершиться.
Джонатан Юніс

4
@JonathanEunice Ви не можете точно моделювати реальність. Вхід для моделі походить від вимірювань, і ви, ймовірно, ніколи не зможете виміряти речі настільки точно, щоб справжня цифра у сучасному комп’ютері / програмному забезпеченні (на той час) обмежувала це. Іншими словами, ви можете мати ідеальну модель, програмне чи математичне, це не має значення. Наприклад, обчисліть об'єм коробки. a*b*cпростий матеріал, проте вам потрібно виміряти розміри, які ви не можете зробити з абсолютною впевненістю, таким чином, вам дійсно не потрібна нескінченна точність обчислення в будь-якому разі, достатньо, щоб бути пов'язаною помилкою вимірювання.
luk32

2
@ luk32 Ми жорстоко погоджуємось щодо більшості цих моментів. Можна точно моделювати якусь річ (об'єм сфери, наприклад), але ніколи не може точно виміряти. І реальність ніколи не вписується в ідеальну модель. Краще отримати трохи неточні корисні значення / моделі, ніж чекати ідеальних вимірювань чи обчислень - те, що завжди буде за крок.
Джонатан Юніс

2
"Суть справи полягає в тому, що для більшості наукових та інженерних розрахунків потрібна велика швидкість і величезний діапазон". Якщо я даю вам тривалий час, ви все одно не можете точно обчислити, оскільки алгоритми для обчислення точно невідомі. Перш за все, ми навіть не можемо точно представити числа. Це лише проблема, яку ми не знаємо, як вирішити ні швидко, ні повільно.
Майкл Ле Барб'є Грюневальд

@ MichaelGrünewald, ми не можемо точно представити реальні числа, але ми здатні вирішити проблеми з досить близьким наближенням, що ми можемо побудувати структури у пару тисяч футів у висоту, ідентифікувати гени в ДНК та провести супутник із кометою через два роки в космосі. Якщо перефразовувати Ренді Ньюмена, це може бути не точно, але все в порядку. Насправді ми можемо представити раціональні можливості саме за допомогою бібліотек довільної точності (з урахуванням обмежень пам'яті).
Чарльз Е. Грант

30

Яку альтернативу ви пропонуєте?

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

  • Ви можете вибрати всі обчислювані цифри, що схоже на те, що роблять комп'ютерні алгебра системи (CAS). Проблема полягає в тому, що це стає швидко нездійсненним, оскільки ваше дерево виразів стає все більшим і більшим. Це також дуже повільно: спробуйте вирішити величезну систему диференціальних рівнянь у Mathematica символічно та порівняйте їх із деякими іншими реалізаціями на основі плаваючої крапки, і ви побачите кардинальну різницю у швидкості. Крім того, як зазначають Йорг У Міттаг та Касперд: у вас навіть немає рішучих операцій рівності / порівняння.

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

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

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


1
Один з найкращих відповідей, я не помітив її, перш ніж писати свою.
Майкл Ле Барб'є Грюневальд

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

1
Чи не використання всіх обчислюваних дійсних даних може зіткнутися з проблемою порівнянь? Я впевнений, що ви не можете порівнювати довільні обчислювальні цифри, не вирішивши проблему зупинки.
kasperd

@kasperd: Я думаю, це певною мірою залежатиме від того, які операції було дозволено використовувати при обчисленні, хоча я не впевнений, яким багатим є набір типів обчислень, і все ще гарантую, що будь-які два довільні результати, які можуть бути що виробляються в кінцевій кількості операцій, можна порівняти в обмежений час. Алгебраїчні типи майже напевно відповідали б цьому критерію, але я не знаю, чи можна було б додавати функції ln (x) та exp (x) і все-таки її задовольняти.
supercat

Ви можете підтримувати арифметику довільної точності (додавання, множення, віднімання, ділення), ірраціоналів (на зразок √2), добре відомих трансценденталей (таких як Pi і e), триггерних функцій тощо, використовуючи тривалі дроби. Дивіться алгоритм Госпера в HAKMEM. Закінчивши, ви можете виконати ледачу оцінку, щоб отримати наближення плаваючої точки до потрібної точності.
Павло Чорноч

14

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

Ключовий термін, який ви повинні зрозуміти тут: значущі цифри . Значущі цифри числа - це ті цифри, які мають значення, що сприяють його точності.

Що в основному означає, якщо я констатую, що щось довше 12 сантиметрів, то воно може бути десь між 11,5 і 12,5 сантиметрами. Якщо я зазначу, що щось довше 12,00 сантиметрів, це може бути десь від 11,995 до 12,005 сантиметрів.

Так само як ілюстрація, якщо ви берете вимірювальну стрічку і вимірюєте свою вітальню. Хоча ви можете виявити, що він шириною 6 метрів 25 сантиметрів, ви знаєте, що вимірювання вашої стрічки було недостатньо точним, щоб нічого не сказати про міліметрову точність або нанометрову точність.


@leftaroundabout що ви маєте на увазі математику (як в математиці) - це не наука? У моїй книзі це так.
Пітер Б

2
@PieterB: Математика - це не наука. Це філософія. Наука - це акт формування розуміння нашого фізичного світу. Філософія - це акт розуміння того, як ідеї працюють в ідеальному світі.
slebetman

Я думаю, що наука зазвичай вважає за краще працювати з явними діапазонами довіри, а не зі значущою цифрою.
Taemyr

@slebetman Крім того, що це не має нічого спільного з моїм моментом у моєму дописі, якщо математика - це наука чи ні, я не можу не відмовитись від цитати: Природа невідповідно математична, і вона говорить нам з математики. Треба лише слухати. Оскільки природа є математичною, будь-яка наука, яка має намір описати природу, повністю залежить від математики. Неможливо переоцінити цей момент, і саме тому Карл Фрідріх Гаус назвав математику "королевою наук".
Пітер Б

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

7

Зауважте, що числа з плаваючою комою в основному такі ж, як наукові та інженерні позначення, стандартний спосіб для людей писати числа з математики та науки. У цих полях немає великої потреби в надзвичайній точності, але часто існує величезний діапазон.

Щоб вибрати випадковий приклад із домашнього завдання з фізики, мені нещодавно довелося працювати з масою електрона, яка становить приблизно 9,11 * 10 ^ -31 кг. Мене мало хвилює точність; це легко може бути 9,12 для всіх, що мені цікаво. Але я дбаю про показник і не хочу виписувати 0,0000 ... 911 кг, тому я використовую наукові позначення.

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


6

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

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

Зокрема, діаграм Кахана щодо впровадження Java з плаваючою точкою , хоча є досить запальним, дає кілька хороших моментів щодо того, чому семантика IEEE-754 є корисною, і багато біт знака знака Ado About Nothing знаходить обґрунтування підписаного нуля на значну глибину.


Я ще не прочитав цілий папір Кахана, але він здається ввічливішим, ніж я. Java могла б мати числові показники, які були більш корисними та виконувались швидше, ніж вони є насправді, якби вона додала realтип, який потребує трьох записів стека для зберігання, і представляв би природну обчислювальну точність машини; значення може бути збережене у вигляді 80-бітного поплавця + 16 біт, доповненого 64-бітовим поплавком + 32-бітним накладом, або 64-бітної мантіси, 16-бітного експонента та 16 біт для знака та прапорів [для реалізації не FPU].
supercat

Вкажіть, що це floatі doubleформати зберігання, і realце обчислювальний формат. У багатьох системах, де немає FPU, робота з мантіссою, експонентами та прапорами, що знаходяться на межі слова та півслова, була б швидшою, ніж розпаковувати та перепаковувати подвійні з кожною операцією.
supercat

2

TL; DR Ми не знаємо, як обчислити більшість функцій з ідеальною точністю, тому немає сенсу представляти числа з ідеальною точністю.

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

Наївна відповідь на наївне питання

Здається, ваше запитання швидше "є точні арифметичні бібліотеки, чому б ми не використали їх замість арифметики з плаваючою комою?" Відповідь полягає в тому, що точна арифметика працює на раціональних числах і що:

  • Число Архімеда - педантична назва π - нераціональне.
  • Багато інших важливих констант нераціональні.
  • Для багатьох інших важливих констант навіть не відомо, що вони раціональні чи ні.
  • Для будь-якого ненульового раціонального числа x число exp (x) нераціональне.
  • Подібні твердження стосуються радикалів, логарифмів і безлічі важливих для вчених функцій (розподіл Гаусса, його CDF, функції Бесселя, функції Ейлера,…).

Раціональне число - удача випадковість. Більшість чисел не раціональні (див. Теорему Байра), тому обчислення чисел завжди виведе нас із раціонального світу.

Що таке обчислення та представлення числа?

Ми можемо відреагувати, сказавши: «Добре, проблема полягає в тому, що раціональні числа не були настільки чудовим вибором для представлення реальних чисел». Потім ми згортаємо вилку Deleaes і розробляємо нову систему представлення реальних чисел.

Якщо ми хочемо обчислити числа, ми повинні вибрати систему подання реальних чисел і описати важливі операції над ними - тобто визначити, що означає обчислення . Оскільки нас цікавлять наукові обчислення, ми хочемо точно зобразити всі десяткові числа (наші міри), їх коефіцієнти (раціональні числа), значення експоненціальних функцій та деякі смішні константи, наприклад, число Архімеда.

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

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


Я думаю, що це чудова відповідь, тільки не на це запитання, наскільки я не впевнений, що запитуючий зрозуміє моменти, які ви ставите. Це і ви досить зближуєтеся з неточним представленням \ Real або \ Складних чисел за допомогою кінцевого цифрового зображення (незалежно від динамічної чи статичної ширини бітів). Це все цілком правдиво, але крім суть. Кудо за не роботизований союзник із посиланням на Гольдберга. :) І теорема Беара не є частиною звичайної риторики, виявленої у програмістів або StackOverflow.
mctylr

0

Тому що

1) Автори роблять припущення, що "інженерно-науковий розрахунок" вимірює реальні фізичні величини

2) Фізичні величини безперервні, і саме так, як ви заявляєте "числа з плаваючою комою, ви зможете моделювати безперервні величини"

.. а решту моєї відповіді красиво підсумовує Rufflewind , тому я не збираюся це повторювати тут.


0

Числа з плаваючою комою забезпечують відносну точність: вони можуть представляти числа, які є щонайменше невеликим відсотком (якщо ви хочете називати щось на зразок 0,0000000000001% у відсотках) від будь-якого точного числа в широкому діапазоні чисел. Вони діляться цією ознакою за допомогою правила слайда, хоча останнє не стає кращим, ніж щось на зразок 3-х цифр точності. Однак це було цілком достатньо для опрацювання статичних і динамічних сил великих структур, перш ніж цифрові комп'ютери стали для цього звичними, і це тому, що матеріальні константи також демонструють певні варіації, і вибирати конструкції, які є досить доброякісними щодо матеріальних і будівельних відмінностей, як правило, щоб зробити максимальне навантаження та слабкі місця зрозумілим.

Тепер "точність" є корисною характеристикою для багатьох чисел, що представляють вимірювання та / або величини фізичних властивостей.

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

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

Також мови програмування, такі як C або Fortran, напрочуд важко отримати доступ до основних операцій, таких як змішане множення точності та ділення, або біт переносу для додавання / віднімання, і це основні будівельні блоки для виходу за межі цілих чисел з обмеженою точністю.

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


0

Я думаю, що на це можна відповісти, вирішивши, які типи додатків float/ doubleданих не підходять.

Коли вам потрібно переконатися, що ви можете точно представляти число з певною кількістю цифр, то числа з плаваючою комою є недоцільними, оскільки вони представляють числа як потужність 2, а не потужність 10, як це ми представляємо числа в реальний світ.

Отже, один домен, де типи даних з плаваючою комою не слід використовувати, - це фінанси *. Для основної системи, наприклад, банку, було б абсолютно неприйнятно, якщо сума, яка мала становити 100000,01 долара, раптом перетвориться на 100000,00 доларів або 100000,02 долара.

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

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

* Я колись працював над фінансовою програмою, де floats використовувались для відображення значень, і як наслідок, були введені помилки округлення. На щастя, ця конкретна помилка взагалі не була критичною, користувачі скаржилися на помилки обчислення в програмі. І це призвело до іншого, набагато гіршого ефекту: користувачі почали втрачати віру в систему.

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