Исследуя точность чисел с плавающей точкой, я видел в некоторых местах утверждение, подобное
" float и double являются ( предназначены для / часто используются в ) инженерных и научных расчетов "
Насколько я понимаю, сила чисел с плавающей точкой и двойников - это количество памяти, которое они используют для своей (хорошей, но не идеальной) точности.
Я чувствую, что почти получаю понимание от этого ответа
«числа с плавающей точкой позволяют моделировать непрерывные величины»
Я до сих пор не убежден, что понимаю. Инженерия и наука звучат как области, в которых вы хотели бы получить точные результаты своих расчетов, которые, по моему пониманию, не дают плавающие точки. Я также не уверен, что точно понимаю, что такое «непрерывное количество».
Может кто-нибудь расширить это объяснение и, возможно, привести пример?
источник
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.
В науке и технике вы заботитесь только о точности до определенной точки. Использование бесконечной точности для каждого вычисления часто неоправданно дорого. Что отличает плавающую точку от фиксированной, так это то, что вам не нужно фиксировать определенное количество десятичных разрядов - вы можете иметь действительно небольшие количества с большим количеством десятичных знаков или действительно большие количества с ограниченной точностью.Ответы:
Вычисления в науке и технике требуют компромиссов в точности, дальности и скорости. Арифметика с фиксированной точкой обеспечивает точность и приличную скорость, но жертвует дальностью. BigNum, библиотеки произвольной точности, выигрывают по дальности и точности, но теряют по скорости.
Суть в том, что большинству научных и инженерных расчетов требуется высокая скорость и большой диапазон, но при этом требуется относительно скромная потребность в точности. Наиболее точно определенная физическая константа известна только до 13 цифр, а многие значения известны с гораздо меньшей достоверностью. Наличие более 13 цифр точности на компьютере не поможет. Муха в мази заключается в том, что последовательности операций с плавающей запятой могут постепенно терять точность. Хлеб с маслом численного анализа позволяет выяснить, какие проблемы особенно восприимчивы к этому, и найти умные способы реорганизации последовательности операций для уменьшения проблемы.
Исключением является теория чисел в математике, которая должна выполнять арифметические операции над числами с миллионами цифр, но с абсолютной точностью. Теоретики числовых чисел часто используют библиотеки BigNum, и они мирились со своими вычислениями, занимающими много времени.
источник
a*b*c
это просто, но вам нужно измерить размеры, которые вы не можете сделать с абсолютной уверенностью, поэтому вам все равно не нужна бесконечная точность вычислений, достаточно того, чтобы ограничиться ошибкой измерения.Какую альтернативу вы предлагаете?
Непрерывные величины представлены с использованием действительных чисел в математике. Не существует типа данных, который мог бы кодировать каждое возможное действительное число (потому что действительные числа неисчислимы), так что это означает, что мы можем выбрать только подмножество тех действительных чисел, которые нас больше всего интересуют.
Вы можете выбрать все вычислимые вещественные числа, что аналогично тому, что делают системы компьютерной алгебры (CAS). Проблема состоит в том, что это становится быстро неосуществимым, поскольку ваше дерево выражений становится все больше и больше. Это также очень медленно: попробуйте решить огромную систему дифференциальных уравнений в Mathematica символически и сравните с какой-либо другой реализацией на основе плавающей запятой, и вы увидите резкое различие в скорости. Кроме того, как указывали Йорг В. Миттаг и Касперд: у вас даже нет решаемых операций равенства / сравнения.
Вы можете использовать точные рациональные числа, но на самом деле это не работает для многих приложений, потому что вам нужно вычислять квадратные корни или косинусы или логарифмы и т. Д. Кроме того, существует также тенденция к усложнению рациональных чисел, что требует больше места для хранения. и время для обработки, поскольку вы выполняете все больше и больше вычислений над ними.
Вы также можете использовать десятичные числа произвольной точности, но тогда даже такое простое, как деление, не сработает, потому что вы получаете бесконечно повторяющиеся цифры. Вы также можете столкнуться с проблемой увеличения сложности, так как вы выполняете более похожие на рациональные числа, хотя и в меньшей степени.
Таким образом, вы будете вынуждены использовать аппроксимации в какой-то момент, и в этом случае это именно то, где числа с плавающей точкой работают лучше всего. Числа с плавающей точкой также имеют фиксированную ширину (в отличие от всех трех других типов данных, упомянутых ранее), что предотвращает увеличение сложности, поскольку вы выполняете все больше и больше вычислений для них.
источник
Ваше предположение о науке неверно: инженерия и наука, кроме математики, не дают точных результатов. Они работают с точностью, которая зависит от количества отображаемых цифр.
Ключевой термин, который вы должны понимать здесь: значимые цифры . Значимые цифры числа - это те цифры, которые несут значение, способствующее его точности.
Что в основном означает, что если я утверждаю, что длина чего-то составляет 12 сантиметров, то на самом деле это может быть где-то между 11,5 и 12,5 сантиметров. Однако, если я утверждаю, что длина чего-то составляет 12,00 сантиметров, это может быть где-то между 11,995 и 12,005 сантиметров в длину.
Просто в качестве иллюстрации, если вы берете измерительную ленту и измеряете свою гостиную. Несмотря на то, что вы можете обнаружить, что он имеет ширину 6 метров 25 сантиметров, вы знаете, что измерение на вашей ленте было недостаточно точным, чтобы что-то сказать о миллиметровой или нанометровой точности.
источник
Обратите внимание, что числа с плавающей точкой в основном совпадают с научными и инженерными обозначениями, стандартным способом написания чисел в математике и естествознании. В этих областях нет особой необходимости в предельной точности, но часто существует огромный диапазон.
Чтобы выбрать случайный пример из моей домашней работы по физике, мне недавно пришлось работать с массой электрона, которая составляет примерно 9,11 * 10 ^ -31 кг. Меня не волнует точность; это легко может быть 9,12 для всех меня волнует. Но я забочусь об показателе и не хочу выписывать 0,0000 ... 911 кг, поэтому я использую научную запись.
Аналогичные рассуждения применимы в научных и инженерных вычислениях: существует огромный диапазон, но нам не нужно хранить и работать с очень большими числами, поэтому мы храним нормализованное значение и показатель степени, с которым меньше и быстрее работать.
источник
Числа с плавающей точкой также имеют несколько свойств, которые хорошо подходят для вычисления определенных типов научных результатов. В частности, точность обратно пропорциональна величине, как в научной нотации, поэтому вы можете представлять как небольшие различия, близкие к нулю, так и большие различия гораздо дальше.
Статья Голдберга, вероятно, является самым известным анализом свойств чисел с плавающей запятой (и ее следует обязательно прочитать, если вы заботитесь о подобных вещах), но статьи Кахана, я думаю, лучше объясняют обоснование многих из тонких вопросы дизайна.
В частности, диатриба Кахана о реализации Java с плавающей запятой , хотя и весьма подстрекательская, дает несколько хороших замечаний о том, почему семантика IEEE-754 полезна, и « Много шума из ничего» о знаковых битах исследует обоснование знакового нуля на значительной глубине.
источник
real
тип, который будет хранить три записи в стеке, и будет представлять естественную вычислительную точность машины; значение может быть сохранено в виде 80-разрядного числа с плавающей запятой + 16 битов, дополняющего 64-разрядного числа с плавающей запятой + 32-разрядного заполнения, или 64-разрядного мантиссы, 16-разрядного показателя степени и 16 битов для знака и флагов [для реализаций без FPU].float
иdouble
форматы хранения, иreal
вычислительный формат. Во многих системах без FPU работа с мантиссой, показателем степени и флагами, находящимися на границах слова и полуслова, была бы быстрее, чем необходимость распаковывать и перепаковывать дубли при каждой операции.TL; DR Мы не знаем, как вычислить большинство функций с идеальной точностью, поэтому нет точки, представляющей числа с идеальной точностью.
Все ответы до сих пор упускают самый важный момент: мы не можем вычислить точные значения большинства чисел. В качестве важного частного случая мы не можем вычислить точные значения экспоненциальной функции, чтобы привести только самую важную иррациональную функцию.
Наивный ответ на наивный вопрос
Похоже, ваш вопрос довольно «есть точные арифметические библиотеки, почему бы нам не использовать их вместо арифметики с плавающей запятой?» Ответ заключается в том, что точная арифметика работает с рациональными числами и что:
Рациональное число - это счастливая случайность. Большинство чисел не рационально (см. Теорему Бэра), поэтому вычисление чисел всегда выведет нас из рационального мира.
Что такое вычисление и представление числа?
Мы можем отреагировать, сказав: «Хорошо, проблема в том, что рациональные числа не были таким хорошим выбором для представления действительных чисел». Затем мы свернули наш разделитель Debian и разработали новую систему представления для действительных чисел.
Если мы хотим вычислить числа, мы должны выбрать систему представления действительных чисел и описать важные операции над ними - то есть определить, что означают вычисления . Поскольку мы заинтересованы в научных вычислениях, мы хотим точно представить все десятичные числа (наши меры), их частные (рациональные числа), значения экспоненциальных функций и некоторые забавные константы, такие как число Архимеда.
Проблема в том, что единственный способ идеально представить числа в такой системе - это использовать символическую форму, то есть вообще ничего не вычислять и работать с алгебраическими выражениями. Это довольно ограниченное представление действительных чисел, потому что мы не можем надежно сравнить два числа (какое больше)? Мы даже не можем легко ответить на вопрос «Является ли данное число равным 0?».
Если вы ищете более точные математические определения и задачи, ищите рациональные числа, трансцендентные числа, наилучшие приближения и теорему Бэра, например.
источник
Потому что
1) Авторы предполагают, что «инженерные и научные расчеты» измеряют физические величины в реальном мире.
2) Физические величины являются непрерывными, и именно так, как вы заявляете, «числа с плавающей точкой позволяют моделировать непрерывные величины»
... и остальная часть моего ответа хорошо подытожена Раффлвиндом , так что я не собираюсь повторять это здесь.
источник
Числа с плавающей запятой обеспечивают относительную точность: они могут представлять числа, которые не более чем на небольшой процент (если вы хотите назвать что-то вроде 0,0000000000001% в процентах) от любого точного числа в широком диапазоне чисел. Они разделяют эту черту с правилом скольжения, хотя последнее не становится лучше, чем что-то вроде 3 цифр точности. Тем не менее, этого было вполне достаточно для определения статических и динамических сил больших структур, прежде чем цифровые компьютеры стали обычным явлением для этого, и это потому, что материальные константы также демонстрируют некоторую вариацию, и выбор конструкций, которые являются достаточно благоприятными по отношению к материалам и конструкциям, будет иметь тенденцию сделать максимальные нагрузки и слабые места разумно идентифицируемыми.
Теперь «точность» является полезной функцией для многих чисел, представляющих измерения и / или величины физических свойств.
Не все в науке / технике относится к этой категории. Например, если вы используете теоретико-числовые преобразования для умножения больших чисел или поля Галуа для манипулирования полиномами с исправлением ошибок, такой вещи, как небольшая ошибка, не существует: любая битовая ошибка во время обработки приведет к результатам, которые совершенно неотличимы от полностью случайных шум.
Даже в этих областях можно работать с числами с плавающей запятой (например, используя сложные БПФ для свертки), если вы отслеживаете накопление ошибок и следите за тем, чтобы ошибки с плавающей запятой не накапливали достаточную величину, чтобы возможно даже перевернуть один бит в фактические объекты, которые они являются приблизительными. Для таких приближений обработка с фиксированной запятой, вероятно, была бы более подходящей, но единицы с плавающей запятой в поле, как правило, обеспечивают более быструю работу и большее количество используемых битов.
Также языки программирования, такие как C или Fortran, делают на удивление трудным доступ к базовым операциям, таким как умножение и деление со смешанной точностью или бит переноса для сложения / вычитания, и это основные строительные блоки для выхода за пределы целочисленных чисел с ограниченной точностью.
Таким образом, если вы можете сопоставить операции с числами с плавающей запятой, у вас сейчас есть достаточно мощное аппаратное обеспечение, и вы можете достаточно хорошо указать свои алгоритмы на одном из современных языков программирования общего назначения.
источник
Я думаю, что на это можно ответить, обратившись к тому, какие приложения
float
/double
типы данных не подходят.Когда вам нужно убедиться, что вы можете точно представить число с определенным количеством цифр, тогда числа с плавающей запятой неуместны, потому что они представляют числа в виде степеней 2, а не степеней 10, как мы представляем числа в реальный мир.
Таким образом, одна область, где типы данных с плавающей запятой не должны использоваться, - это область финансов *. Для базовой системы, например, банка, было бы совершенно неприемлемо, если бы сумма, которая должна была составить 100000,01 долл. США, внезапно стала 100000,00 долл. США или 100000,02 долл. США.
Такая проблема может легко возникнуть при использовании чисел с плавающей запятой, особенно если число было результатом одного или нескольких вычислений, например, расчета суммы всех транзакций на счете.
Инженерные и научные расчеты являются областями, где допустимы эти относительно небольшие ошибки округления. Пользователи обычно знают, что все числа имеют ограниченную точность, и они часто работают с рядом значащих цифр . Но самое главное, они имеют четко определенную относительную точность, то есть они обеспечивают одинаковое количество значащих цифр, как для очень больших чисел, так и для очень маленьких чисел.
* Однажды я работал над финансовым приложением, где
float
s использовалось для представления значений, и, как следствие, были допущены ошибки округления. К счастью, эта конкретная ошибка не была критической, пользователи жаловались на ошибки в вычислениях в программе. И это привело к другому, гораздо худшему эффекту: пользователи начали терять веру в систему.источник