Актуальность вычислений с фиксированной и произвольной точностью


10

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

Существуют ли какие-либо ОСНОВНЫЕ трудности при использовании, скажем, решателя собственных значений с фиксированной точкой? Насколько медленными / быстрыми, неточными / точными они будут?

Связанные: это и это


Milind R, спасибо за ваш вопрос. Я думаю, что ваш вопрос интересен, но, вероятно, не подходит для сайта. Я призываю вас посмотреть на сайте FAQ для руководства. Когда я смотрю на ваш вопрос, у меня складывается впечатление, что это начало разглагольствования, хотя я думаю, что присутствуют элементы соответствующего сайту вопроса. Стоит спросить, есть ли много применений целочисленной арифметики и арифметики с фиксированной точкой в ​​вычислительной науке, и попросить сравнить эту арифметику с плавающей точкой. Я рекомендую редактировать ваш пост.
Джефф Оксберри

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

5
Я думаю, что на это есть объективный технический ответ: если вы выполняете практически любые научные вычисления (скажем, линейное решение), количество битов, необходимых для точного хранения, растет во времени экспоненциально. Таким образом, сильная поддержка неточности требуется для полезной работы.
Джеффри Ирвинг

@MilindR: Сообщество вычислительной геометрии было заинтересовано в вычислениях реальных чисел, которые являются высокопроизводительными и точными одновременно. Я думаю, что все практические вопросы, имеющие отношение к вам, можно наблюдать в этой области исследований. Примером, который вы можете найти, является библиотека LEDA.
shuhalo

@ GeoffreyIrving А как насчет нулей в треугольных матрицах? Разве они не могут быть сохранены как что-либо кроме неточной плавающей точки, склонной к ошибкам?
Milind R

Ответы:


5

Использование арифметики с фиксированной запятой может быть целесообразным при определенных обстоятельствах. Как правило, для научных вычислений (по крайней мере, в том смысле, в котором большинство людей думают об этом) это не подходит из-за необходимости выражать большие динамические диапазоны, которые встречаются. Вы упоминаете проблемы собственных значений в качестве примера, но очень часто в науке интересуются наименьшие собственные значения матрицы (скажем, при вычислении основного состояния квантовой системы). Точность малых собственных значений, как правило, будет значительно ухудшаться по сравнению с большими собственными значениями, если вы используете фиксированную точку. Если ваша матрица содержит записи, которые отличаются большими соотношениями, малые собственные значения могут быть совершенно невыразимы в рабочей точности. Это проблема с представлением чисел; эти аргументы сохраняются независимо от того, как вы выполняете промежуточные вычисления. Вы могли бы разработать масштабирование для применения к вычисленным результатам, но теперь вы только что изобрели число с плавающей запятой. Легко построить матрицы, элементы которых ведут себя хорошо, но собственные значения которых ведут себя крайне плохо (например,Матрицы Уилкинсона или даже матрицы с полностью целочисленными элементами ). Эти примеры не так патологичны, как могут показаться, и многие проблемы на переднем крае науки связаны с матрицами с очень плохим поведением, поэтому использование фиксированной точки в этом контексте является плохой идеей (TM).

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

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

Раньше я думал, что представления с плавающей точкой были грубыми или неточными (зачем тратить биты на показатель степени ?!). Но со временем я понял, что это действительно одно из лучших представлений для реальных чисел. Вещи в природе проявляются в логарифмическом масштабе, поэтому реальные данные охватывают широкий диапазон показателей. Также для достижения максимально возможной относительной точности требуется работа с логарифмическими масштабами, что делает отслеживание показателя степени более естественным. Единственный другой претендент на «естественное» представление - это симметричный индекс уровня . Однако сложение и вычитание гораздо медленнее в этом представлении, и ему не хватает аппаратной поддержки IEEE 754. Огромное количество идей было вложено в стандарты с плавающей запятой.Столпом числовой линейной алгебры. Я думаю, он знает, что такое «правильное» представление чисел.


4

В качестве примера того, почему точная арифметика / арифметика с фиксированной точкой используется так редко, рассмотрим это:

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

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


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

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

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

Проблема в том, что ошибки округления чрезвычайно трудно анализировать. Я понял это в тот день, когда начал изучать численный анализ и числовую линейную алгебру. Таким образом, система, которая полностью избегает проблемы, делая кондиционирование несущественной, должна взять штурмом мир, верно? было мышление. Конечно, я понимаю ограничения, но они казались скорее раздражителями, чем нарушителями. Вроде как повышенная сложность уменьшения транзисторов в процессорах. Да, это сложно анализировать, но Intel все еще делает это.
Milind R

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

3

Если вы посмотрите на эту библиотеку для правильного округления: CRlibm , вы увидите в документации, что, как правило, алгоритмы должны быть проверены на точность (с обоснованными доказательствами). Почему? Стабильность и скорость сходимости результата функции не имеют универсального ответа. Короче говоря, нет «бесплатного обеда» - вы должны работать, чтобы доказать, что ваши рассуждения верны. Это происходит из-за поведения моделируемых функций, а не из-за аппаратного обеспечения (используете ли вы целочисленные единицы или числа с плавающей запятой, хотя да, у обоих есть «ошибки», такие как переполнение / понижение, ненормальные числа и т. Д.), Даже если результат вы ищете сходится к целому числу, алгоритм, используемый для поиска результата, не обязательно очень стабильным.

Eigen - это библиотека C ++, которая имеет множество алгоритмов для решения матриц, каждый из которых имеет свои свойства. Эта страница содержит таблицу, в которой обсуждаются соотношения скорости и точности для различных алгоритмов, используемых для решения матрицы. Я подозреваю, что библиотека Eigen может делать то, что вы хотите. :-)


Спасибо .. Очень информативно, и хорошая ссылка. Но разве использование фиксированной точки наряду с ограниченной степенью округления не приводит к более точным результатам? Так как само представление точно для начала, в отличие от плавающей запятой?
Milind R

1
Я предлагаю вам атаковать вашу проблему с другой точки зрения. Вступая в логику, вы узнаете, что решение проблемы состоит из трех частей: определения, обоснование и вывод / результат. Вы, вероятно, (как и большинство из нас) очень привыкли работать в основном над этапом «определения» решения проблем - обычно вы можете «определить» свою проблему; однако, если вы расстроены, иногда вы сталкиваетесь с более сложным типом проблемы, которая требует дополнительной работы в части «рассуждения».
Мда

Я только смутно понимаю вас ... Я не могу понять, где я могу "определить" эту проблему, аргументация важна.
Milind R

Спустя несколько лет я на самом деле вас понимаю :-)
Milind R

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