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


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.