std::riemann_zeta, std::riemann_zetaf, std::riemann_zetal

来自cppreference.com
 
 
 
 
在标头 <cmath> 定义
(1)
float       riemann_zeta ( float num );

double      riemann_zeta ( double num );

long double riemann_zeta ( long double num );
(C++17 起)
(C++23 前)
/* floating-point-type */ riemann_zeta( /* floating-point-type */ num );
(C++23 起)
float       riemann_zetaf( float num );
(2) (C++17 起)
long double riemann_zetal( long double num );
(3) (C++17 起)
在标头 <cmath> 定义
template< class Integer >
double      riemann_zeta ( Integer num );
(A) (C++17 起)
1-3) 计算 num黎曼 zeta 函数标准库提供所有以无 cv 限定的浮点类型作为参数 num 的类型的 std::riemann_zeta 重载。 (C++23 起)
A) 为所有整数类型提供额外重载,将它们当做 double

参数

num - 浮点或整数值

返回值

如果没有发生错误,那么返回 num 的黎曼 Zeta 函数值,ζ(num),定义于整个实轴:

  • 对于 num>1,是 Σ
    n=1
    n-num
  • 对于 0≤num≤1,是
    1
    1-21-num
    Σ
    n=1
    (-1)n-1
    n-num
  • 对于 num<0,是 2num
    πnum-1
    sin(
    πnum
    2
    )Γ(1−num)ζ(1−num)

错误处理

可能报告 math_errhandling 中指定的错误

  • 如果参数是 NaN,那么返回 NaN 且不报告定义域错误

注解

不支持 C++17,但支持 ISO 29124:2010 的实现在定义了 __STDCPP_MATH_SPEC_FUNCS__ 为至少 201003L 的值,且用户在包含任何标准库头文件前定义了 __STDCPP_WANT_MATH_SPEC_FUNCS__ 时也会提供此函数。

不支持 ISO 29124:2010 但支持 TR 19768:2007 (TR1) 的实现也会在标头 tr1/cmath 及命名空间 std::tr1 中提供此函数。

此函数的一种实现参考 boost.math

额外重载不需要以 (A) 的形式提供。它们只需要能够对它们的整数类型实参 num 确保 std::riemann_zeta(num)std::riemann_zeta(static_cast<double>(num)) 的效果相同。

示例

#include <cmath>
#include <iostream>
#include <numbers>
 
constexpr auto π = std::numbers::pi;
 
int main()
{
    // 广为人知的值的点检查
    std::cout << "ζ(-1)  = " << std::riemann_zeta(-1) << '\n'
              << "ζ(0)   = " << std::riemann_zeta(0) << '\n'
              << "ζ(1)   = " << std::riemann_zeta(1) << '\n'
              << "ζ(0.5) = " << std::riemann_zeta(0.5) << '\n'
              << "ζ(2)   = " << std::riemann_zeta(2) << '\n'
              << "π²/6   = " << π * π / 6 << '\n';
}

输出:

ζ(-1)  = -0.0833333
ζ(0)   = -0.5
ζ(1)   = inf
ζ(0.5) = -1.46035
ζ(2)   = 1.64493
π²/6   = 1.64493

外部链接

Weisstein, Eric W. “黎曼 Zeta 函数”来自 MathWorld--A Wolfram Web Resource。