Я пишу небольшую и неадекватную библиотеку линейной алгебры на C++ для проекта (извините). Я реализую матрицы и операции, используя числа двойной точности. Я делаю правильно? Должен ли я вместо этого реализовать класс шаблона? Есть ли более точный тип вокруг?
Лучший базовый тип для работы с линейной алгеброй
Ответы (6)
Я написал библиотеку линейной алгебры С++, используя шаблоны. Я подумал, что когда-нибудь мы, возможно, захотим использовать комплексные числа или числа повышенной точности. Это было, наверное, семь лет назад, и мы еще этого не сделали. Мы почти всегда используем double в качестве типа шаблона, и у нас есть typedef, чтобы сделать это проще.
Несколько раз мы пошли другим путем, используя типы меньше, чем double. Например, мы использовали float вместо double в приложении с привязкой к памяти, описанном здесь< /а>. Но в 99,9% случаев мы используем двойники.
Если вы используете аргумент шаблона, следите за тем, чтобы использовать целочисленный тип, но неявно требующий тип с плавающей запятой. Например, предположим, что у вас есть матрица, все записи которой являются целыми числами, поэтому вы используете класс matrix‹int›. Но затем вы передаете это линейному решателю. Теперь ваши арифметические действия выполняются с использованием целочисленного деления, и ваши результаты неверны. (Я сделал это!)
Я бы реализовал класс/структуру, используя шаблон. В начале вы, скорее всего, будете довольствоваться только double
, но я обнаружил, что в каждом проекте, где я не реализовал матрицы как шаблоны, позже сожалел об этом.
Кроме того, это дает вам возможность использовать более интересные алгебры элементов - интервальную арифметику, распределения вероятностей, сложную математику, сопоставление с фиксированной точкой, подматрицы, простую математику :-) и т. д.
Я пишу небольшую и неадекватную библиотеку линейной алгебры на C++ для проекта (извините)
ОЙ! Будьте осторожны, будьте очень-очень осторожны... Проверьте JAMA/TNT — это получил одобрение NIST, и они уже обработали некоторые из «более простых» математических операций линейной алгебры, например. различные алгоритмы факторинга. Линейная алгебра включает в себя множество сложных вопросов с числовой точностью (например, матрицы Гильберта) и многое другое. например, заниматься своими делами, это одна из тех областей, где вы, возможно, захотите использовать хорошую прочную основу, которая уже была хорошо протестирована.
Вы должны иметь возможность использовать с ним long double (не совсем уверен в этом), но сами алгоритмы, вероятно, более важны, чем точность матриц.
Ответ на последний вопрос: Да, есть, он называется long double
и по крайней мере так же точен, как double
. Для использования шаблонов или нет, да, я бы использовал шаблоны. Это отличный вариант использования для них, и я думаю, что это облегчит перенос на какой-то другой скалярный тип числа. Затем вы также можете просто ввести число с плавающей запятой и / или двойную матрицу, в зависимости от системы, в которой вы работаете, и какая из них работает быстрее / лучше.
Не делайте для себя лишней работы. Если вы можете обойтись двойным (или длинным двойным), используйте его.
Похоже, это всего лишь небольшой проект, и в этом случае шаблон просто заставит вас работать.
Другой вариант, который не обсуждался, — это использование шаблона для определения типа вашего элемента. Это не требует много дополнительной работы, если таковая имеется, но позволяет внести некоторые изменения позже.
Нет другого более точного типа, чем long double, который также имеет аппаратную поддержку. Но вы можете создавать свои собственные типы, если чувствуете потребность в большей точности. Однако они будут намного медленнее, чем собственный тип double, даже с обширной оптимизацией.