Boost.Math 包含多个数学领域的贡献:浮点数实用工具、特定宽度浮点数类型、数学常数、统计分布、特殊函数、根查找和函数最小化、多项式和有理函数、插值,以及数值积分和微分。其中许多特性都采用模板化设计,以支持内置类型和扩展宽度类型(例如 Boost.Multiprecision)。
本次发布
依赖项
Boost 数学库
公告:本库需要一个兼容的 C++14 编译器。
主分支 | 开发分支 | |
---|---|---|
Drone | ||
Github Actions | ||
Codecov |
Math 库以现代 C++ 实现了众多高级数学函数。该库致力于在保持高性能的同时,提供最高级别的数值和语法正确性。
所有代码均为头文件形式,方便客户端在整个多样化的函数集合中进行设置和使用。
本库由几个相互关联的部分组成
浮点数实用工具
用于处理浮点数算术的实用函数,包括浮点数分类(fpclassify、isnan、isinf 等)、符号操作、四舍五入、比较以及计算浮点数之间距离的函数。
特定宽度浮点数类型
一组 typedef
,类似于 C++20 的 <stdfloat>
提供的类型,但位于 namespace boost
中。
数学常数
各种各样的常数,从分数到 $\pi$ 的各种倍数、欧拉常数等。
这些常数当然可以从模板代码中使用,或者作为非模板使用,并提供简化的接口,如果这更合适的话。
统计分布
提供了一套相当全面的统计分布,在此基础上可以构建更高级的统计测试。
初步的重点放在中心单变量分布。提供了连续(如正态分布和 Fisher 分布)和离散(如二项分布和泊松分布)分布。
提供了一份全面的教程,以及一系列示例,说明如何使用本库进行统计检验。
特殊函数
提供了一系列高质量的特殊函数;最初,这些函数集中在统计应用中使用的函数以及 C++ 库扩展技术报告中的函数。
当前实现的函数族包括伽马函数、贝塔函数和误差函数,以及不完全伽马函数和不完全贝塔函数(每种四种变体),以及它们的各种反函数,再加上双伽马函数、各种阶乘函数、贝塞尔函数、椭圆积分、超几何函数、三角函数(及其双曲变体)、反双曲函数、勒让德/拉盖尔/埃尔米特/切比雪夫多项式,以及各种特殊幂函数和对数函数。
所有实现都是完全通用的,并支持使用任意“实数”类型,包括 Boost.Multiprecision 中的类型。然而,大多数函数都针对具有已知尾数(或小数部分)大小的类型进行了优化:通常是内置的 float
、double
或 long double
。
这些函数还为 TR1 特殊函数提供了支持基础,其中许多函数已标准化为 C++17。
根查找
一套全面的实线根查找算法,包括带导数和无导数的方法。
优化
通过 Brent 方法和差分进化算法最小化成本函数。
多项式和有理函数
用于处理多项式以及高效计算有理式或多项式的工具。
插值
通过重心有理插值、紧支撑二次、三次和五次 B 样条、切比雪夫变换、三角多项式、Makima、pchip、三次 Hermite 样条和双线性插值进行函数插值。
数值积分和微分
一套相当全面的例程,用于积分(梯形、高斯-勒让德、高斯-克隆罗德、高斯-切比雪夫、双指数和蒙特卡洛)和微分(切比雪夫变换、有限差分、复步导数和前向模式自动微分)。
积分例程可用于返回复数的函数,因此可用于计算路径积分。
四元数和八元数
四元数和八元数是类似于 std::complex 的类模板。
完整的文档可在 boost.org 上找到。
独立模式
定义 BOOST_MATH_STANDALONE
允许 Boost.Math 在没有任何 Boost 依赖项的情况下使用。在此模式下,某些功能会受到限制。如果某个特定功能被独立模式禁用,将通过 `static_assert` 消息进行提醒。独立模式并非设计用于与 Boost 的其他部分一起使用,并可能导致编译器错误。
支持的编译器
以下编译器已通过 CI 系统测试,并且已知可以正常工作。目前,使用 Boost.Math 需要一个完全符合 C++14 的编译器。
- g++ 5 或更高版本
- clang++ 5 或更高版本
- Visual Studio 2015 (14.0) 或更高版本
支持、错误和功能请求
错误和功能请求可以通过 GitHub 问题跟踪器(请参阅 未解决的问题和 已解决的问题)进行报告。
您可以通过 拉取请求提交您的更改。
没有专门针对 Boost Math 的邮件列表,但您可以使用通用 Boost 邮件列表,并在邮件主题中使用 [math] 标签。
开发
克隆整个 boost 项目,其中包含各个 Boost 项目作为子模块(参见 boost+git 文档)。
$ git clone https://github.com/boostorg/boost
$ cd boost
$ git submodule update --init
Boost Math Library 位于 libs/math/
目录下。
运行测试
首先,请确保您位于 libs/math/test
目录下。您可以运行 Jamfile.v2
中列出的所有测试,也可以运行单个测试。
test$ ../../../b2 <- run all tests
test$ ../../../b2 static_assert_test <- single test
test$ # A more advanced syntax, demoing various options for building the tests:
test$ ../../../b2 -a -j2 -q --reconfigure toolset=clang cxxflags="--std=c++14 -fsanitize=address -fsanitize=undefined" linkflags="-fsanitize=undefined -fsanitize=address"
持续集成
PR 或 PR 提交的默认操作是 CI 运行完整的测试集。可以在提交消息末尾添加以下内容来修改行为。
* [ci skip] to skip all tests
* [linux] to test using GCC Versions 5-12 and Clang Versions 5-14 on Ubuntu LTS versions 18.04-22.04.
* [apple] to test Apple Clang on the latest version of MacOS.
* [windows] to test MSVC-14.0, MSVC-14.2, MSVC-14.3, CYGWIN, and mingw on the latest version of Windows.
* [standalone] to run standalone mode compile tests
构建文档
完整说明可以在 此处找到,但在此稍作重申。
libs/math/doc$ brew install docbook-xsl # on mac
libs/math/doc$ touch ~/user-config.jam
libs/math/doc$ # now edit so that:
libs/math/doc$ cat ~/user-config.jam
using darwin ;
using xsltproc ;
using boostbook
: /usr/local/opt/docbook-xsl/docbook-xsl
;
using doxygen ;
using quickbook ;
libs/math/doc$ ../../../b2