Лучший базовый тип для работы с линейной алгеброй

StackOverflow https://stackoverflow.com/questions/381695

Вопрос

Я пишу небольшую и неадекватную библиотеку линейной алгебры на C ++ для проекта (прошу прощения).Я реализую матрицы и операции, используя числа двойной точности.Я все делаю правильно?Должен ли я вместо этого реализовать шаблонный класс?Есть ли где-нибудь более точный типаж?

Это было полезно?

Решение

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

Несколько раз мы шли другим путем, используя типы меньший чем в двойном размере.Например, мы использовали float вместо double в описанном приложении с привязкой к памяти здесь.Но в 99,9 процентах случаев мы используем дубли.

Если вы используете аргумент шаблона, следите за использованием целочисленного типа, но неявно требующего типа с плавающей запятой.Например, предположим, у вас есть матрица, все элементы которой являются целыми числами, и поэтому вы используете matrix<int> класс.Но затем вы передаете это линейному решателю.Теперь ваша арифметика выполняется с использованием целое число разделение, и ваши результаты неверны.(Я сделал это!)

Другие советы

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

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

Я пишу маленькую и неадекватную библиотеку линейной алгебры на C ++ для проекта (прошу прощения)

ОЙ!Будь осторожен, будь очень, очень осторожен...Проверьте JAMA/ТНТ -- на нем стоит штамп одобрения NIST, и они уже разобрались с некоторыми "более простыми" математическими решениями линейной алгебры, напримерразличные алгоритмы факторинга.Линейная алгебра включает в себя множество сложных проблем с числовой точностью (например Матрицы Гильберта) и как бы мне ни нравилось заниматься своим делом, это одна из тех областей, где вам, возможно, захочется использовать хорошую прочную основу, которая уже была хорошо протестирована.

Вы должны быть в состоянии использовать long double с ним (не совсем уверены в этом), но сами алгоритмы, вероятно, более критичны, чем точность матриц.

Окончательный ответ на вопрос:Да, есть, это называется long double и, по крайней мере, так же точен, как double.Что касается того, использовать шаблоны или нет, да, я бы использовал шаблоны.Это отличный вариант использования для них, и я думаю, что это упростит перенос на какой-нибудь другой тип скалярных чисел.Затем вы также можете просто ввести значение с плавающей точкой и / или двойную матрицу, в зависимости от системы, на которой вы работаете, и какая из них работает там быстрее / лучше.

Не создавайте для себя никакой дополнительной работы.Если вы можете обойтись двойным (или длинным двойным), пойдите с этим.

Похоже, что это всего лишь небольшой проект, и в этом случае шаблон просто заставит вас работать.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top