Почему числа с плавающей запятой часто используются в науке / технике?

33

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

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

Насколько я понимаю, сила чисел с плавающей точкой и двойников - это количество памяти, которое они используют для своей (хорошей, но не идеальной) точности.

Я чувствую, что почти получаю понимание от этого ответа

«числа с плавающей точкой позволяют моделировать непрерывные величины»

Я до сих пор не убежден, что понимаю. Инженерия и наука звучат как области, в которых вы хотели бы получить точные результаты своих расчетов, которые, по моему пониманию, не дают плавающие точки. Я также не уверен, что точно понимаю, что такое «непрерывное количество».

Может кто-нибудь расширить это объяснение и, возможно, привести пример?

DoubleDouble
источник
2
Смотрите с плавающей
точкой-gui.de
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
Также следует отметить, что ошибки округления также не будут накапливаться. Это зависит от того, что вы делаете и как вы это делаете; есть целое поле, посвященное этому.
Доваль
10
Плавающая точка не является «случайной точностью», ошибки для различных операций предсказуемы и хорошо известны, а ошибки для алгоритма могут быть обработаны. Если они достаточно низкие (и, в частности, если ваши обратные ошибки меньше, чем неопределенности в ваших входных переменных), вы можете быть уверены, что ваши результаты хороши (или, по крайней мере, любые проблемы с ними не вызваны ошибка точки).
Хоббс

Ответы:

77

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

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

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

Чарльз Э. Грант
источник
2
Хороший ответ. Хотя базовые функции могут быть совершенно непрерывными, что требует точной точности для точного моделирования, реальность такова, что все в науке и технике является приближенным. Мы предпочли бы иметь достойные, полезные приближения и достичь чего-то большего, чем бесконечная точность, для которой мы будем ждать бесконечно много операций.
Джонатан Юнис
4
@JonathanEunice Вы не можете точно моделировать реальность. Входные данные для модели поступают из измерений, и вы, вероятно, никогда не сможете измерить вещи настолько точно, чтобы действительное число в современном компьютере / программном обеспечении (в то время) ограничивало его. Другими словами, вы можете иметь идеальную модель, программное обеспечение или математическое, это не имеет значения. Например, рассчитать объем коробки. a*b*cэто просто, но вам нужно измерить размеры, которые вы не можете сделать с абсолютной уверенностью, поэтому вам все равно не нужна бесконечная точность вычислений, достаточно того, чтобы ограничиться ошибкой измерения.
luk32
2
@ luk32 Мы решительно согласны с большинством из этих пунктов. Можно точно моделировать какую-то вещь (например, объем сферы), но никогда нельзя точно измерить. И реальность никогда не идеально подходит для идеальной модели. Лучше получить немного неточные, полезные значения / модели, чем ждать идеальных измерений или вычислений - то, что всегда будет в одном шаге.
Джонатан Юнис
2
«Суть в том, что большинству научных и инженерных расчетов требуется высокая скорость и большой диапазон». Если я дам вам много времени, вы все равно не сможете точно вычислить, потому что алгоритмы вычисления точно неизвестны. И прежде всего, мы даже не можем точно представить числа. Это просто проблема, которую мы не знаем, как решить, ни быстро, ни медленно.
Михаэль Ле Барбье Грюневальд
@ MichaelGrünewald, мы не можем точно представить действительные числа, но мы можем решить проблемы в достаточно близком приближении, чтобы мы могли строить структуры высотой в пару тысяч футов, идентифицировать гены в ДНК и встречать спутник с кометой через два года в космосе. Перефразируя Рэнди Ньюмана, это может быть не совсем точно, но все в порядке. Фактически мы можем представлять рациональные числа в точности, используя библиотеки произвольной точности (с учетом ограничений памяти).
Чарльз И. Грант
30

Какую альтернативу вы предлагаете?

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

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

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

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

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

Rufflewind
источник
1
Один из лучших ответов, я пропустил его, прежде чем писать свой.
Михаэль Ле Барбье Грюневальд
8
Плюс, есть немного неудобный факт, что вы даже не можете сказать, равны ли два вычислимых реала.
Йорг Миттаг
1
Разве использование всех вычислимых реалов не приведет к проблеме со сравнениями? Я почти уверен, что вы не можете сравнить произвольные вычислимые реалы без решения проблемы остановки.
kasperd
@kasperd: Я думаю, что это в какой-то мере будет зависеть от того, какие операции разрешено использовать в вычислениях, хотя я не уверен, насколько богат набор вычислительных типов, и все же могу гарантировать, что любые два произвольных результата могут быть Произведенное за конечное число операций можно было бы сравнить за ограниченное время. Алгебраические типы почти наверняка соответствовали бы этому критерию, но я не знаю, можно ли добавить функции ln (x) и exp (x) и все еще соответствовать этому.
суперкат
Вы можете поддерживать арифметику произвольной точности (сложение, умножение, вычитание, деление), иррационалы (например, √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 кг, поэтому я использую научную запись.

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

raptortech97
источник
6

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

Статья Голдберга, вероятно, является самым известным анализом свойств чисел с плавающей запятой (и ее следует обязательно прочитать, если вы заботитесь о подобных вещах), но статьи Кахана, я думаю, лучше объясняют обоснование многих из тонких вопросы дизайна.

В частности, диатриба Кахана о реализации Java с плавающей запятой , хотя и весьма подстрекательская, дает несколько хороших замечаний о том, почему семантика IEEE-754 полезна, и « Много шума из ничего» о знаковых битах исследует обоснование знакового нуля на значительной глубине.

Даниэль Приден
источник
Я еще не прочитал всю статью Кахана, но он кажется более вежливым, чем я. У Java могли бы быть числовые значения, которые были бы более полезными и выполнялись быстрее, чем на самом деле, если бы добавили realтип, который будет хранить три записи в стеке, и будет представлять естественную вычислительную точность машины; значение может быть сохранено в виде 80-разрядного числа с плавающей запятой + 16 битов, дополняющего 64-разрядного числа с плавающей запятой + 32-разрядного заполнения, или 64-разрядного мантиссы, 16-разрядного показателя степени и 16 битов для знака и флагов [для реализаций без FPU].
суперкат
Укажите, что floatи doubleформаты хранения, и realвычислительный формат. Во многих системах без FPU работа с мантиссой, показателем степени и флагами, находящимися на границах слова и полуслова, была бы быстрее, чем необходимость распаковывать и перепаковывать дубли при каждой операции.
суперкат
2

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

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

Наивный ответ на наивный вопрос

Похоже, ваш вопрос довольно «есть точные арифметические библиотеки, почему бы нам не использовать их вместо арифметики с плавающей запятой?» Ответ заключается в том, что точная арифметика работает с рациональными числами и что:

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

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

Что такое вычисление и представление числа?

Мы можем отреагировать, сказав: «Хорошо, проблема в том, что рациональные числа не были таким хорошим выбором для представления действительных чисел». Затем мы свернули наш разделитель Debian и разработали новую систему представления для действительных чисел.

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

Проблема в том, что единственный способ идеально представить числа в такой системе - это использовать символическую форму, то есть вообще ничего не вычислять и работать с алгебраическими выражениями. Это довольно ограниченное представление действительных чисел, потому что мы не можем надежно сравнить два числа (какое больше)? Мы даже не можем легко ответить на вопрос «Является ли данное число равным 0?».

Если вы ищете более точные математические определения и задачи, ищите рациональные числа, трансцендентные числа, наилучшие приближения и теорему Бэра, например.

Михаэль Ле Барбье Грюневальд
источник
Я думаю, что это отличный ответ, только не на этот вопрос, поскольку я не уверен, что спрашивающий поймет ваши замечания. Это, и вы довольно откровенны с неточным представлением чисел \ Real или \ Complex с помощью конечного цифрового представления (независимо от динамической или статической битовой ширины). Это все полностью верно, но не в этом суть. Престижность для не роботизированного союзника со ссылкой на Гольдберга. :) И теорема Бэра не является частью обычной риторики программистов или StackOverflow.
Mctylr
0

Потому что

1) Авторы предполагают, что «инженерные и научные расчеты» измеряют физические величины в реальном мире.

2) Физические величины являются непрерывными, и именно так, как вы заявляете, «числа с плавающей точкой позволяют моделировать непрерывные величины»

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

Ян Догген
источник
0

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

Теперь «точность» является полезной функцией для многих чисел, представляющих измерения и / или величины физических свойств.

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

Даже в этих областях можно работать с числами с плавающей запятой (например, используя сложные БПФ для свертки), если вы отслеживаете накопление ошибок и следите за тем, чтобы ошибки с плавающей запятой не накапливали достаточную величину, чтобы возможно даже перевернуть один бит в фактические объекты, которые они являются приблизительными. Для таких приближений обработка с фиксированной запятой, вероятно, была бы более подходящей, но единицы с плавающей запятой в поле, как правило, обеспечивают более быструю работу и большее количество используемых битов.

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

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

user153796
источник
0

Я думаю, что на это можно ответить, обратившись к тому, какие приложения float/ doubleтипы данных не подходят.

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

Таким образом, одна область, где типы данных с плавающей запятой не должны использоваться, - это область финансов *. Для базовой системы, например, банка, было бы совершенно неприемлемо, если бы сумма, которая должна была составить 100000,01 долл. США, внезапно стала 100000,00 долл. США или 100000,02 долл. США.

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

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

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

Пит
источник