Boost.Math 在数学领域包含多项贡献:浮点数工具、特定宽度浮点数类型、数学常数、统计分布、特殊函数、求根和函数最小化、多项式和有理函数、插值以及数值积分和微分。其中许多特性都使用了模板,支持内置类型和扩展宽度类型(例如 Boost.Multiprecision)。
本次发布
依赖项
Boost 数学库
公告:本库需要兼容 C++14 的编译器。
| 主分支 | 开发分支 | |
|---|---|---|
| Drone | ||
| Github Actions | ||
| Codecov |
数学库使用现代 C++ 实现,提供了众多高级数学函数。本库力求在确保高性能的同时,达到最高的数值和语法正确性。
所有代码均为头文件,方便客户在各种函数集合中进行轻松设置和使用。
本库分为几个相互关联的部分
浮点数工具
用于处理浮点数算术的实用函数,包括浮点数分类(fpclassify、isnan、isinf 等)、符号操作、舍入、比较以及计算浮点数之间距离的函数。
特定宽度浮点数类型
一组 `typedef`,类似于 C++20 的 `
数学常数
提供各种各样的常数,从分数到 $\pi$ 的各种倍数、欧拉常数等。
当然,这些都可以从模板代码中使用,或者在不太复杂的情况下使用简化接口作为非模板使用。
统计分布
提供了一套相对全面的统计分布,可以在其上构建更高级别的统计测试。
最初的重点是中心单变量分布。提供了连续分布(如正态分布和 Fisher 分布)和离散分布(如二项分布和泊松分布)。
提供了一份全面的教程,以及一系列示例,说明如何使用本库进行统计测试。
特殊函数
提供了一系列高质量的特殊函数;最初这些函数集中在统计应用中使用的函数以及 C++ 库扩展技术报告中的函数。
当前实现的函数族包括伽马函数、贝塔函数和误差函数,以及不完全伽马函数和不完全贝塔函数(每种有四种变体),以及它们的各种逆函数,再加上 digamma 函数、各种阶乘函数、贝塞尔函数、椭圆积分、超几何函数、正弦基函数(及其双曲变体)、反双曲函数、勒让德/拉盖尔/埃尔米特/切比雪夫多项式以及各种特殊的幂函数和对数函数。
所有实现都是完全通用的,并支持使用任意“实数”类型,包括 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 问题跟踪器(请参阅 未解决的问题 和 已解决的问题)报告 Bug 和功能请求。
您可以通过 拉取请求 提交您的更改。
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