ELC in dev
ELC-lang
载入中...
搜索中...
未找到
elc::defs::base::math 命名空间参考

命名空间

namespace  concepts
 概念名称空间 基于标准库的概念,但是使用帮助类型来便于后续定义中的新算数类型重载
 
namespace  linear_interpolation
 线性插值.
 

struct  arithmetic_type_info_prover
 算术类型帮助类型 任何后续定义的新算术类型都可以重载这些类型来实现数学库的泛型支持 更多...
 
struct  get_prime_factorization_t
 
struct  prime_factorization_table_t
 
struct  rounding_auto_setter
 
struct  unique_prime_factorization_table_t
 

类型定义

template<typename T >
using to_unsigned_t = typename arithmetic_type_info_prover< remove_cvref< T > >::unsigned_type
 
template<typename T >
using to_signed_t = typename arithmetic_type_info_prover< remove_cvref< T > >::signed_type
 
template<typename T >
using float_type_of = typename arithmetic_type_info_prover< remove_cvref< T > >::float_type
 
template<typename T >
using integer_type_of = typename arithmetic_type_info_prover< remove_cvref< T > >::integer_type
 

函数

template<arithmetic_type T>
constexpr bool isNaN (const T &v) noexcept
 
template<basic_type T>
constexpr bool isInf (const T &v) noexcept
 
template<arithmetic_type T>
requires (!has_inf<T>)
constexpr bool isInf (const T &) noexcept
 
template<arithmetic_type T>
constexpr bool is_negative (const T &x) noexcept
 
template<typename T = void, typename Arg_t = void>
constexpr auto copy_as_negative (Arg_t x, bool negative=1) noexcept
 
template<arithmetic_type T>
constexpr auto reverse_sign (const T &x) noexcept
 
template<arithmetic_type T>
constexpr auto reverse_sign_if (bool x, const T &y) noexcept
 
template<basic_float_type T>
constexpr auto reciprocal (const T &x) noexcept
 
template<arithmetic_type T, arithmetic_type U>
constexprsafe_arithmetic_cast (U x) noexcept
 
template<arithmetic_type T>
constexpr size_t to_size_t (T x) noexcept
 
template<arithmetic_type T>
constexpr uintmax_t to_uintmax_t (T x) noexcept
 
template<arithmetic_type T1, arithmetic_type T2>
constexpr auto mod (const T1 &a, const T2 &b)
 
template<arithmetic_type T>
constexpr bool is_odd (const T &x) noexcept
 
template<arithmetic_type T>
constexpr bool is_even (const T &x) noexcept
 
template<arithmetic_type T1, arithmetic_type T2>
requires (!is_big_type<T1>&&!is_big_type<T2>)
constexpr auto divmod (const T1 &a, const T2 &b)
 
template<arithmetic_type T, arithmetic_type U>
constexpr auto ceil_div (const T &a, const U &b) noexcept
 
template<typename T >
constexpr void set_rounding (int mode)
 
template<typename T >
constexpr int get_rounding ()
 
template<arithmetic_type T>
constexpr auto abs (const T &v) noexcept
 
template<arithmetic_type T>
constexpr bool is_close (const T &a, const T &b) noexcept
 
template<arithmetic_type T1, arithmetic_type T2>
constexpr auto sub (const T1 &a, const T2 &b) noexcept
 
template<float_type T>
constexprexp (const T &v) noexcept
 
template<arithmetic_type T>
constexpr auto log (const T &a) noexcept
 
template<arithmetic_type T, arithmetic_type U>
constexpr auto log (const T &a, const U &b) noexcept
 
template<unsigned_integer_type T>
constexpr size_t integer_log (const T &a, const auto &b) noexcept
 
template<arithmetic_type T, arithmetic_type U = unsigned>
requires (!is_big_type<T>)
constexpr auto pow (const T &a, const U &b=2) noexcept
 
template<big_type T, unsigned_integer_type U = unsigned>
constexpr auto pow (T a, U b=2) noexcept
 
template<float_type T>
requires is_basic_type<T>
constexpr auto trunc (const T &v) noexcept
 
template<float_type T>
requires is_basic_type<T>
constexpr auto ceil (const T &v) noexcept
 
template<float_type T>
requires is_basic_type<T>
constexpr auto floor (const T &v) noexcept
 
template<float_type T>
requires (has_ε<T>)
constexprinvsqrt (const T &v) noexcept
 
template<float_type T, arithmetic_type U = T>
constexprinvsqrt_iteration (const T &num, const U &v) noexcept
 
template<float_type T, arithmetic_type U = T>
constexprinvsqrt_to_new_ε (T num, const U &v, const to_unsigned_t< T > &ε, to_unsigned_t< T > &ε_saver) noexcept
 
template<float_type T>
constexprquick_invsqrt (const T &v) noexcept
 
template<float_type T>
constexprinvsqrt (const T &v, const to_unsigned_t< T > &ε, to_unsigned_t< T > &ε_saver) noexcept
 
template<float_type T>
constexprinvsqrt (const T &v, const to_unsigned_t< T > &ε) noexcept
 
template<integer_type T>
constexpr auto invsqrt (const T &v) noexcept
 
template<float_type T>
requires (has_ε<T>)
constexprsqrt (const T &v) noexcept
 
template<float_type T, arithmetic_type U = T>
constexprsqrt_iteration (const T &num, const U &v) noexcept
 
template<float_type T, arithmetic_type U = T>
constexprsqrt_to_new_ε (T num, const U &v, const to_unsigned_t< T > &ε, to_unsigned_t< T > &ε_saver) noexcept
 
template<float_type T, arithmetic_type U = T>
constexprsqrt_to_new_ε (T num, const U &v, const to_unsigned_t< T > &ε) noexcept
 
template<float_type T>
constexprquick_sqrt (const T &v) noexcept
 
template<float_type T>
constexprsqrt (const T &v, const to_unsigned_t< T > &ε, to_unsigned_t< T > &ε_saver) noexcept
 
template<float_type T>
constexprsqrt (const T &v, const to_unsigned_t< T > &ε) noexcept
 
template<integer_type T>
constexpr auto sqrt (const T &v) noexcept
 
template<arithmetic_type T>
constexpr bool is_prime_num_no_pre_check (T a) noexcept
 
template<arithmetic_type T>
constexpr bool is_prime_num (T a) noexcept
 
template<arithmetic_type T>
constexprget_prime_num_less_or_eq_than (T a) noexcept
 求小于或等于某数的素数
 
template<arithmetic_type T>
constexprget_prime_num_big_or_eq_than (T a) noexcept
 求大于或等于某数的素数
 
template<arithmetic_type T>
constexpr auto get_prime_num_big_than (T a) noexcept
 求大于某数的素数
 
template<unsigned_integer_type size_T>
constexpr size_T get_next_gold_size_to_resize_for_array (size_T size) noexcept
 已知当前array的size,求下一个合适的提前分配大小
 
template<unsigned_integer_type size_T>
constexpr size_T get_next_gold_size_to_resize_for_hash (size_T size) noexcept
 已知当前hash table的size,求下一个合适的桶大小
 
template<unsigned_integer_type T>
constexpr auto factorial (unsigned n, unsigned start=1u) noexcept
 
template<integer_type T>
auto binary_gcd (T x, T y) noexcept
 
template<integer_type T>
auto euclidean_gcd (T x, T y) noexcept
 
template<integer_type T>
auto base_gcd (T x, T y) noexcept
 
template<unsigned_big_integer_type T>
auto lehmer_gcd (T x, T y) noexcept
 
template<integer_type T>
auto gcd (T x, T y) noexcept
 
template<signed_float_type T>
constexprsin (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexprsin (T num) noexcept
 
template<float_type T>
constexprarctan (T num, const to_unsigned_t< T > &ε) noexcept
 
template<float_type T>
requires (has_ε<T>)
constexprarctan (T num) noexcept
 
template<signed_float_type T>
constexprcos (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexprcos (T num) noexcept
 
template<signed_float_type T>
constexprtan (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexprtan (T num) noexcept
 
template<signed_float_type T>
constexprcot (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexprcot (T num) noexcept
 
template<signed_float_type T>
constexprsec (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexprsec (T num) noexcept
 
template<signed_float_type T>
constexprcsc (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexprcsc (T num) noexcept
 
template<signed_float_type T>
constexpr to_unsigned_t< T > arccos (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexpr to_unsigned_t< T > arccos (T num) noexcept
 
template<float_type T>
constexprarcsin (T num, const to_unsigned_t< T > &ε) noexcept
 
template<float_type T>
requires (has_ε<T>)
constexprarcsin (T num) noexcept
 
template<signed_float_type T>
constexpr to_unsigned_t< T > arccot (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexpr to_unsigned_t< T > arccot (T num) noexcept
 
template<signed_float_type T>
constexprarcsec (T num, const to_unsigned_t< T > &ε) noexcept
 
template<signed_float_type T>
requires (has_ε<T>)
constexprarcsec (T num) noexcept
 
template<float_type T>
constexprarccsc (T num, const to_unsigned_t< T > &ε) noexcept
 
template<float_type T>
requires (has_ε<T>)
constexprarccsc (T num) noexcept
 

变量

constexpr struct elc::defs::base::math::get_prime_factorization_t get_prime_factorization
 

类型定义说明

◆ float_type_of

对应的浮点数类型

在文件 all_defs.cpp1600 行定义.

◆ integer_type_of

对应的整数类型

在文件 all_defs.cpp1603 行定义.

◆ to_signed_t

有符号位的对应类型

在文件 all_defs.cpp1597 行定义.

◆ to_unsigned_t

无符号位的对应类型

在文件 all_defs.cpp1594 行定义.

函数说明

◆ abs()

template<arithmetic_type T>
constexpr auto elc::defs::base::math::abs ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4506 行定义.

4506 {
4507 if constexpr(is_signed<T>){
4508 //符号转无符号而不是num=-num避免INT_MAX这种情况下的溢出
4509 typedef to_unsigned_t<T> UT;
4510 return is_negative(v)?UT(-v):UT(v);
4511 }
4512 else
4513 return v;
4514 }
typename arithmetic_type_info_prover< remove_cvref< T > >::unsigned_type to_unsigned_t
constexpr bool is_negative(const T &x) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ arccos() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr to_unsigned_t< T > elc::defs::base::math::arccos ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5518 行定义.

5518 {
5520 }
constexpr to_unsigned_t< T > arccos(T num, const to_unsigned_t< T > &ε) noexcept
算术类型帮助类型 任何后续定义的新算术类型都可以重载这些类型来实现数学库的泛型支持
函数调用图:

◆ arccos() [2/2]

template<signed_float_type T>
constexpr to_unsigned_t< T > elc::defs::base::math::arccos ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5514 行定义.

5514 {
5515 return to_unsigned_t<T>(π_with_ε(ε)/2u - arctan(num, ε));
5516 }
constexpr T arctan(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ arccot() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr to_unsigned_t< T > elc::defs::base::math::arccot ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5536 行定义.

5536 {
5538 }
constexpr to_unsigned_t< T > arccot(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:

◆ arccot() [2/2]

template<signed_float_type T>
constexpr to_unsigned_t< T > elc::defs::base::math::arccot ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5532 行定义.

5532 {
5533 return to_unsigned_t<T>(π_with_ε(ε)/2u - arctan(num, ε));
5534 }
函数调用图:
这是这个函数的调用关系图:

◆ arccsc() [1/2]

template<float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::arccsc ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5554 行定义.

5554 {
5556 }
constexpr T arccsc(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:

◆ arccsc() [2/2]

template<float_type T>
constexpr T elc::defs::base::math::arccsc ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5550 行定义.

5550 {
5551 return arcsin(reciprocal(num), ε);
5552 }
constexpr auto reciprocal(const T &x) noexcept
constexpr T arcsin(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ arcsec() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::arcsec ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5545 行定义.

5545 {
5547 }
constexpr T arcsec(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:

◆ arcsec() [2/2]

template<signed_float_type T>
constexpr T elc::defs::base::math::arcsec ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5541 行定义.

5541 {
5542 return arccos(reciprocal(num), ε);
5543 }
函数调用图:
这是这个函数的调用关系图:

◆ arcsin() [1/2]

template<float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::arcsin ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5527 行定义.

5527 {
5529 }
函数调用图:

◆ arcsin() [2/2]

template<float_type T>
constexpr T elc::defs::base::math::arcsin ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5523 行定义.

5523 {
5524 return arctan(num/reciprocal(sqrt(1-pow(num), ε)), ε);
5525 }
constexpr T sqrt(const T &v) noexcept
constexpr auto pow(const T &a, const U &b=2) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ arctan() [1/2]

template<float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::arctan ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5464 行定义.

5464 {
5466 }
函数调用图:

◆ arctan() [2/2]

template<float_type T>
constexpr T elc::defs::base::math::arctan ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5442 行定义.

5442 {
5443 /*
5444 arctan (-x) = -arctan(x)
5445 arctan (1/x) = 0.5 * π - arctan(x) [x > 0]
5446 */
5447 if constexpr(signed_type<T>)
5448 if (num < 0) return -arctan(abs(num), ε);
5449 if (num > 1) return π_with_ε(ε)/2u - arctan(reciprocal(move(num)), ε);
5450
5451 size_t i = 1; bool negation = false; // 取反
5452 to_signed_t<T> result = num;
5453 T numerator_base = num, sum, num_pow = pow(num); // 求num2的次方
5454 do {
5455 numerator_base *= num_pow; // 求阶乘
5456 negation = !negation; // 每次循环取反
5457 sum = numerator_base/i; // 单步计算结果
5458 result += reverse_sign_if(negation,sum); // 求和
5459 i += 2;
5460 }while (abs(sum) > ε);
5461 return (T)result;
5462 }
constexpr auto reverse_sign_if(bool x, const T &y) noexcept
constexpr auto abs(const T &v) noexcept
typename arithmetic_type_info_prover< remove_cvref< T > >::signed_type to_signed_t
函数调用图:
这是这个函数的调用关系图:

◆ base_gcd()

template<integer_type T>
auto elc::defs::base::math::base_gcd ( x,
y 
)
inlinenoexcept

在文件 all_defs.cpp5257 行定义.

5257 {
5258 if constexpr(BIT_POSSIBILITY==2)
5259 return binary_gcd(move(x), move(y));
5260 else
5261 return euclidean_gcd(move(x), move(y));
5262 }
auto euclidean_gcd(T x, T y) noexcept
auto binary_gcd(T x, T y) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ binary_gcd()

template<integer_type T>
auto elc::defs::base::math::binary_gcd ( x,
y 
)
inlinenoexcept

在文件 all_defs.cpp5226 行定义.

5226 {
5227 static_assert(BIT_POSSIBILITY==2);
5228 size_t shift = 0;
5229 while(y){
5230 //都是偶数时,shift++并位移
5231 const auto x_rzero=countr_zero(x);
5232 const auto y_rzero=countr_zero(y);
5233 shift+=min(x_rzero,y_rzero);
5234 //一偶一奇时,只移动偶数 直到都是奇数
5235 x>>=x_rzero;
5236 y>>=y_rzero;
5237 //都是奇数时,大数-=小数
5238 if(x < y)swap(x, y);
5239 x-=y;
5240 }
5241 // 返回 x 左移 shift 位的结果
5242 return move(x) << shift;
5243 }
constexpr size_t countr_zero(const T v) noexcept
countr_zero
constexpr struct elc::defs::base::min_t min
constexpr void swap(T1 &a, T2 &b)
函数调用图:
这是这个函数的调用关系图:

◆ ceil()

template<float_type T>
requires is_basic_type<T>
constexpr auto elc::defs::base::math::ceil ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4653 行定义.

4653 {
4654 if in_consteval{
4655 auto ceil_impl = λ(T x, T y)noexcept{
4656 return is_close(x,y) ? y : y+T{1};
4657 };
4658 return v<0 ? -static_cast<T>(to_uintmax_t(-v)) : ceil_impl(v,static_cast<T>(to_uintmax_t(v)));
4659 }
4660 else
4661 return ::std::ceil(v);
4662 }
#define in_consteval
Definition all_defs.cpp:717
#define λ
Definition all_defs.cpp:623
constexpr bool is_close(const T &a, const T &b) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ ceil_div()

template<arithmetic_type T, arithmetic_type U>
constexpr auto elc::defs::base::math::ceil_div ( const T &  a,
const U b 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4472 行定义.

4472 {
4473 const auto[quot,mod]=divmod(a,b);
4474 return quot+(mod?1u:0u);
4475 }
constexpr auto divmod(const T1 &a, const T2 &b)
constexpr auto mod(const T1 &a, const T2 &b)
函数调用图:
这是这个函数的调用关系图:

◆ copy_as_negative()

template<typename T = void, typename Arg_t = void>
constexpr auto elc::defs::base::math::copy_as_negative ( Arg_t  x,
bool  negative = 1 
)
inlineconstexprnoexcept

符号位设置

在文件 all_defs.cpp4381 行定义.

4381 {
4382 if constexpr(is_unsigned<T>)
4383 template_error("copy_as_negative:unsigned type");
4384 elseif constexpr(type_info<T> == type_info<void>)
4385 return copy_as_negative<to_signed_t<Arg_t>>(x,negative);
4386 elseif constexpr(is_basic_type<Arg_t>) {
4387 if constexpr(is_float_type<Arg_t>)
4388 return(T)::std::copysign(x,negative?-1:1);
4389 else
4390 return(T)negative?T{}-x:x;
4391 }
4392 else
4393 return(T)negative?T{}-x:x;
4394 }
#define elseif
Definition all_defs.cpp:650
#define template_error(reason)
Definition all_defs.cpp:559
函数调用图:
这是这个函数的调用关系图:

◆ cos() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::cos ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5473 行定义.

5473 {
5475 }
constexpr T cos(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:

◆ cos() [2/2]

template<signed_float_type T>
constexpr T elc::defs::base::math::cos ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5469 行定义.

5469 {
5470 return sin(π_with_ε(ε)/2u - num, ε);
5471 }
constexpr T sin(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ cot() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::cot ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5491 行定义.

5491 {
5493 }
constexpr T cot(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:

◆ cot() [2/2]

template<signed_float_type T>
constexpr T elc::defs::base::math::cot ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5487 行定义.

5487 {
5488 return cos(num, ε)/sin(num, ε);
5489 }
函数调用图:
这是这个函数的调用关系图:

◆ csc() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::csc ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5509 行定义.

5509 {
5511 }
constexpr T csc(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:

◆ csc() [2/2]

template<signed_float_type T>
constexpr T elc::defs::base::math::csc ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5505 行定义.

5505 {
5506 return reciprocal(sin(num, ε));
5507 }
函数调用图:
这是这个函数的调用关系图:

◆ divmod()

template<arithmetic_type T1, arithmetic_type T2>
requires (!is_big_type<T1>&&!is_big_type<T2>)
constexpr auto elc::defs::base::math::divmod ( const T1 a,
const T2 b 
)
inlineconstexpr

在文件 all_defs.cpp4458 行定义.

4458 {
4459 typedef decltype(a/b) quot_t;
4460 typedef decltype(a%b) mod_t;
4461 struct divmod_result{
4462 quot_t quot;
4463 mod_t mod;
4464 };
4465 if constexpr(basic_float_type<T1>||basic_float_type<T2>)
4466 return divmod_result{::std::floor(a/b),::std::fmod(a,b)};
4467 else
4468 return divmod_result{a/b,a%b};
4469 }
函数调用图:
这是这个函数的调用关系图:

◆ euclidean_gcd()

template<integer_type T>
auto elc::defs::base::math::euclidean_gcd ( x,
y 
)
inlinenoexcept

在文件 all_defs.cpp5246 行定义.

5246 {
5247 if constexpr(is_signed<T>)
5248 if(is_negative(x) && is_negative(y))
5249 return euclidean_gcd(abs(x), abs(y));
5250 while(y){
5251 if(x < y)swap(x, y);
5252 x = swap(y, x%y);
5253 }
5254 return x;
5255 }
函数调用图:
这是这个函数的调用关系图:

◆ exp()

template<float_type T>
constexpr T elc::defs::base::math::exp ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4540 行定义.

4540 {
4541 if(in_consteval||!is_basic_type<T>){
4542 typedef decltype(λ{
4543 if constexpr(is_basic_type<T>)
4544 return ::std::exp(T{});
4545 else
4546 return T{};
4547 }()) RT;
4548 auto exp_impl = recursive_λ(RT x,RT sum,RT n,size_t i,RT t)noexcept -> RT{
4549 const auto ε=sum+t/n;
4550 if(is_close(sum,ε))
4551 return sum;
4552 else
4553 return self_recursion(x,ε,n*i,i+1,t*x);
4554 };
4555 auto exp_impl_caller = get_recursive_λ_caller(exp_impl);
4556 return exp_impl_caller(RT{v},RT{1u},RT{1u},2,RT{v});
4557 }
4558 elseif constexpr(is_basic_type<T>)
4559 return ::std::exp(v);
4560 }
#define get_recursive_λ_caller(name,...)
Definition all_defs.cpp:618
#define recursive_λ(...)
Definition all_defs.cpp:616
#define self_recursion(...)
Definition all_defs.cpp:629
函数调用图:
这是这个函数的调用关系图:

◆ factorial()

template<unsigned_integer_type T>
constexpr auto elc::defs::base::math::factorial ( unsigned  n,
unsigned  start = 1u 
)
inlineconstexprnoexcept

在文件 all_defs.cpp5150 行定义.

5150 {
5151 constexpr size_t threshold=1<<4;
5152 if (n < threshold) {
5153 T s = 1u;
5154 unsigned end = start + n;
5155 while(start < end)
5156 s *= start++;
5157 return s;
5158 }
5159 unsigned m = (n+1u)/2;
5160 return factorial<T>(m,start)*factorial<T>(n-m,start+m);
5161 }
函数调用图:
这是这个函数的调用关系图:

◆ floor()

template<float_type T>
requires is_basic_type<T>
constexpr auto elc::defs::base::math::floor ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4666 行定义.

4666 {
4667 if in_consteval{
4668 auto floor_impl = λ(T x, T y)noexcept{
4669 return is_close(x,y) ? y : y-T{1};
4670 };
4671 return v<0 ? -static_cast<T>(to_uintmax_t(-v+T{1})) : floor_impl(v,static_cast<T>(to_uintmax_t(v)));
4672 }
4673 else
4674 return ::std::floor(v);
4675 }
函数调用图:
这是这个函数的调用关系图:

◆ gcd()

template<integer_type T>
auto elc::defs::base::math::gcd ( x,
y 
)
inlinenoexcept

在文件 all_defs.cpp5315 行定义.

5315 {
5316 if constexpr(BIT_POSSIBILITY==2){
5317 if constexpr(is_big_type<T>){
5318 constexpr size_t lehmer_threshold = 1<<8;
5319 if(max(x.size_in_base_type(),y.size_in_base_type()) >= lehmer_threshold)
5320 return lehmer_gcd(move(x), move(y));
5321 }
5322 return binary_gcd(move(x), move(y));
5323 }
5324 else
5325 return lehmer_gcd(move(x), move(y));
5326 }
auto lehmer_gcd(T x, T y) noexcept
constexpr struct elc::defs::base::max_t max
函数调用图:
这是这个函数的调用关系图:

◆ get_next_gold_size_to_resize_for_array()

template<unsigned_integer_type size_T>
constexpr size_T elc::defs::base::math::get_next_gold_size_to_resize_for_array ( size_T  size)
inlineconstexprnoexcept

已知当前array的size,求下一个合适的提前分配大小

在文件 all_defs.cpp4898 行定义.

4898 {
4899 /*
4900 每次扩容后的空间与原空间比大致为φ可以最小化时空负担.
4901 */
4902 return size_T(size*magic_number::φ);
4903 }
函数调用图:
这是这个函数的调用关系图:

◆ get_next_gold_size_to_resize_for_hash()

template<unsigned_integer_type size_T>
constexpr size_T elc::defs::base::math::get_next_gold_size_to_resize_for_hash ( size_T  size)
inlineconstexprnoexcept

已知当前hash table的size,求下一个合适的桶大小

在文件 all_defs.cpp4906 行定义.

4906 {
4907 /*
4908 素数大小的桶数可以使hash table中的每个桶尽可能活跃.
4909 每次扩容后的空间与原空间比大致为φ可以最小化时空负担.
4910 */
4911 return size_T(get_prime_num_big_or_eq_than(size*magic_number::φ));
4912 }
constexpr T get_prime_num_big_or_eq_than(T a) noexcept
求大于或等于某数的素数
函数调用图:
这是这个函数的调用关系图:

◆ get_prime_num_big_or_eq_than()

template<arithmetic_type T>
constexpr T elc::defs::base::math::get_prime_num_big_or_eq_than ( a)
inlineconstexprnoexcept

求大于或等于某数的素数

在文件 all_defs.cpp4848 行定义.

4848 {
4849 if constexpr(is_float_type<T>)
4850 a=ceil(a);
4851 if constexpr(is_signed<T>)
4852 if(is_negative(a)){
4853 auto tmp = get_prime_num_less_or_eq_than(abs(a));
4854 return copy_as_negative(tmp);
4855 }
4856 if(a<4u)return a;
4857 //将a转换为6x-1的形式.
4858 {
4859 T b=mod(a,6u);
4860 if(b==1u && is_prime_num_no_pre_check(a))return a;
4861 a+=b?5u-b:1u;
4862 }
4863 //循环判断.
4864 for(;;a+=6u)
4865 if(is_prime_num_no_pre_check(a))return a;
4866 elseif(is_prime_num_no_pre_check(a+2u))return a+2u;
4867 }
constexpr T get_prime_num_less_or_eq_than(T a) noexcept
求小于或等于某数的素数
constexpr auto ceil(const T &v) noexcept
constexpr auto copy_as_negative(Arg_t x, bool negative=1) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ get_prime_num_big_than()

template<arithmetic_type T>
constexpr auto elc::defs::base::math::get_prime_num_big_than ( a)
inlineconstexprnoexcept

求大于某数的素数

在文件 all_defs.cpp4892 行定义.

4892 {
4893 return get_prime_num_big_or_eq_than(a+1u);
4894 }
函数调用图:
这是这个函数的调用关系图:

◆ get_prime_num_less_or_eq_than()

template<arithmetic_type T>
constexpr T elc::defs::base::math::get_prime_num_less_or_eq_than ( a)
inlineconstexprnoexcept

求小于或等于某数的素数

在文件 all_defs.cpp4870 行定义.

4870 {
4871 if constexpr(is_float_type<T>)
4872 a=floor(a);
4873 if constexpr(is_signed<T>)
4874 if(is_negative(a)){
4875 auto tmp = get_prime_num_big_or_eq_than(abs(a));
4876 return copy_as_negative(tmp);
4877 }
4878 if(a<4u)return a;
4879 //将a转换为6x-1的形式.
4880 {
4881 T b=mod(a,6u);
4882 if(b==1u && is_prime_num_no_pre_check(a))return a;
4883 a-=b?b-1u:5u;
4884 }
4885 //循环判断.
4886 for(;;a-=6u)
4887 if(is_prime_num_no_pre_check(a))return a;
4888 elseif(is_prime_num_no_pre_check(a-2u))return a-2u;
4889 }
constexpr auto floor(const T &v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ get_rounding()

template<typename T >
constexpr int elc::defs::base::math::get_rounding ( )
inlineconstexpr

获取浮点舍入

在文件 all_defs.cpp4485 行定义.

4485 {
4486 if constexpr(basic_float_type<T>)
4487 return ::std::fegetround();
4488 else
4489 return 0;
4490 }
函数调用图:
这是这个函数的调用关系图:

◆ integer_log()

template<unsigned_integer_type T>
constexpr size_t elc::defs::base::math::integer_log ( const T &  a,
const auto b 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4591 行定义.

4591 {
4592 auto integer_log_impl = recursive_λ(const T& a,T& tester,const T this_lv,const size_t num)noexcept -> size_t{
4593 size_t aret=0;
4594 {
4595 const auto next_lv=this_lv*this_lv;
4596 if(next_lv<a)
4597 aret=self_recursion(a,tester,next_lv,num*2);
4598 }
4599 floop
4600 if(auto tmp=tester*this_lv;tmp>a)return aret;
4601 else{
4602 tester=move(tmp);
4603 aret+=num;
4604 }
4605 };
4606 auto integer_log_impl_caller = get_recursive_λ_caller(integer_log_impl,noexcept);
4607 T tester=1u;
4608 return integer_log_impl_caller(a,tester,move(b),1u);
4609 }
#define floop
Definition all_defs.cpp:543
函数调用图:
这是这个函数的调用关系图:

◆ invsqrt() [1/4]

template<float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::invsqrt ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4721 行定义.

4721 {
4723 }
constexpr T invsqrt(const T &v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ invsqrt() [2/4]

template<integer_type T>
constexpr auto elc::defs::base::math::invsqrt ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4725 行定义.

4725 {
4726 return invsqrt(static_cast<float_type_of<T>>(v));
4727 }
typename arithmetic_type_info_prover< remove_cvref< T > >::float_type float_type_of
函数调用图:

◆ invsqrt() [3/4]

template<float_type T>
constexpr T elc::defs::base::math::invsqrt ( const T &  v,
const to_unsigned_t< T > &  ε 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4713 行定义.

4713 {
4714 if constexpr(has_NaN<T> && has_inf<T>)
4715 if(v < 0u || v >= arithmetic_type_info_prover<T>::Inf())
4717 return invsqrt_to_new_ε(quick_invsqrt(v),v,ε);
4718 }
constexpr T quick_invsqrt(const T &v) noexcept
constexpr T invsqrt_to_new_ε(T num, const U &v, const to_unsigned_t< T > &ε, to_unsigned_t< T > &ε_saver) noexcept
函数调用图:

◆ invsqrt() [4/4]

template<float_type T>
constexpr T elc::defs::base::math::invsqrt ( const T &  v,
const to_unsigned_t< T > &  ε,
to_unsigned_t< T > &  ε_saver 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4706 行定义.

4706 {
4707 if constexpr(has_NaN<T> && has_inf<T>)
4708 if(v < 0u || v >= arithmetic_type_info_prover<T>::Inf())
4710 return invsqrt_to_new_ε(quick_invsqrt(v),v,ε,ε_saver);
4711 }
函数调用图:

◆ invsqrt_iteration()

template<float_type T, arithmetic_type U = T>
constexpr T elc::defs::base::math::invsqrt_iteration ( const T &  num,
const U v 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4680 行定义.

4680 {
4681 //newton-raphson
4682 return num*(3u-v*num*num)/2u;
4683 }
函数调用图:
这是这个函数的调用关系图:

◆ invsqrt_to_new_ε()

template<float_type T, arithmetic_type U = T>
constexpr T elc::defs::base::math::invsqrt_to_new_ε ( num,
const U v,
const to_unsigned_t< T > &  ε,
to_unsigned_t< T > &  ε_saver 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4685 行定义.

4685 {
4686 while(ε_saver>ε){
4687 auto next_ret=invsqrt_iteration(num,v);
4688 ε_saver=abs(next_ret-num);
4689 num=move(next_ret);
4690 }
4691 return num;
4692 }
constexpr T invsqrt_iteration(const T &num, const U &v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ is_close()

template<arithmetic_type T>
constexpr bool elc::defs::base::math::is_close ( const T &  a,
const T &  b 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4517 行定义.

4517 {
4518 if constexpr(basic_float_type<T>)
4520 else
4521 return a==b;
4522 }
函数调用图:
这是这个函数的调用关系图:

◆ is_even()

template<arithmetic_type T>
constexpr bool elc::defs::base::math::is_even ( const T &  x)
inlineconstexprnoexcept

在文件 all_defs.cpp4453 行定义.

4453 {
4454 return !is_odd(x);
4455 }
constexpr bool is_odd(const T &x) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ is_negative()

template<arithmetic_type T>
constexpr bool elc::defs::base::math::is_negative ( const T &  x)
inlineconstexprnoexcept

符号位查询

在文件 all_defs.cpp4369 行定义.

4369 {
4370 if constexpr(is_signed<T>){
4371 if constexpr(has_NaN<T>)
4372 if(isNaN(x))
4373 return false;
4374 return x<T{};
4375 }
4376 else
4377 return false;
4378 }
constexpr bool isNaN(const T &v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ is_odd()

template<arithmetic_type T>
constexpr bool elc::defs::base::math::is_odd ( const T &  x)
inlineconstexprnoexcept

在文件 all_defs.cpp4445 行定义.

4445 {
4446 if constexpr(is_integer_type<T>)
4447 return x&1;
4448 else
4449 return mod(x,T(2));
4450 }
函数调用图:
这是这个函数的调用关系图:

◆ is_prime_num()

template<arithmetic_type T>
constexpr bool elc::defs::base::math::is_prime_num ( a)
inlineconstexprnoexcept

判断某数是否是素数

在文件 all_defs.cpp4818 行定义.

4818 {
4819 if constexpr(is_float_type<T>)
4820 if(a != ceil(a))
4821 return false;
4822 auto b=abs(a);
4823
4824 if(b<4)
4825 return true;//1和0也是prime,我不管.
4826 /*
4827 当x≥1,那么≥5的自然数如下:
4828 6x-1 6x 6x+1 6x+2 6x+3 6x+4
4829 6(x+1)-1 6(x+1) 6(x+1)+1 ... //这已经是下一周期了.
4830
4831 考虑单个周期:
4832 6x+2 6x+3 6x+4 是 2(3x+1) 3(2x+1) 2(3x+2),排除.
4833 6x,排除.
4834 那么,只用考虑6x±1是否是prime.
4835 */
4836 if(mod(mod(b,6)-1u,4u))
4837 return false;
4838 /*
4839 因为no_pre_check判定没有考虑到≤5的数,所以本函数第一个if进行判定补全.
4840 */
4841 return is_prime_num_no_pre_check(b);
4842 }
constexpr bool is_prime_num_no_pre_check(T a) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ is_prime_num_no_pre_check()

template<arithmetic_type T>
constexpr bool elc::defs::base::math::is_prime_num_no_pre_check ( a)
inlineconstexprnoexcept

判断某数是否是素数,无预先检查以供其他素数相关函数快速调用.

在文件 all_defs.cpp4788 行定义.

4788 {
4789 /*
4790 应某人的要求补注释(都是主人的任务罢了.).
4791 建议先看有预先检查的部分以便理解思路.
4792 */
4793 T b=safe_arithmetic_cast<T>(sqrt(a));//若一个数可以分解为两因数之积,其中一个因数必定≤其开方:反指数式减少遍历范围.
4794 /*
4795 接下来:
4796 设要判定的数n(6x±1的缩写).
4797 测试数可以看为6i-1 6i 6i+1 6i+2 6i+3 6i+4的其中之一,同样以6为周期.
4798 对于测试数的整个周期,其中:
4799 如果n能被6i 6i+2 6i+4整除:则n要是偶数,但±1,排除.
4800 如果n能被6i+3整除:则n要是3倍数,但±1,排除.
4801 综上,循环中只要考虑6i±1的情况.
4802 所以以5起始,前进6(自然选择号,前进4!),逐次判断0与+2.
4803 虽然很想写成以6为起始逐次判断±1的对称格式但是这样会加重时空负担.(不甘心.....)
4804 */
4805 for(T c=5u;c<=b;c+=6u)//遍历判断是否能被因数分解——不会有人看不懂吧?
4806 if((!mod(a,c))||(!mod(a,(c+2u))))
4807 return false;
4808 /*
4809 最后,为什么是6?
4810 就结论来说,此数值选择最常出现的两因数(除0或1外.)之积可以最大程度减少时间占用.
4811 所以虽然更喜欢7/8/9之类的数不过使用6收益最大.
4812 要不是这样早就写成7了.
4813 */
4814 return true;
4815 }
函数调用图:
这是这个函数的调用关系图:

◆ isInf() [1/2]

template<arithmetic_type T>
requires (!has_inf<T>)
constexpr bool elc::defs::base::math::isInf ( const T &  )
inlineconstexprnoexcept

在文件 all_defs.cpp4364 行定义.

4364 {
4365 return false;
4366 }
函数调用图:

◆ isInf() [2/2]

template<basic_type T>
constexpr bool elc::defs::base::math::isInf ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4357 行定义.

4357 {
4358 if constexpr(has_inf<T>)
4360 else
4361 return false;
4362 }
函数调用图:
这是这个函数的调用关系图:

◆ isNaN()

template<arithmetic_type T>
constexpr bool elc::defs::base::math::isNaN ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4349 行定义.

4349 {
4350 if constexpr(has_NaN<T>)
4351 return v!=v;
4352 else
4353 return false;
4354 }
函数调用图:
这是这个函数的调用关系图:

◆ lehmer_gcd()

template<unsigned_big_integer_type T>
auto elc::defs::base::math::lehmer_gcd ( x,
y 
)
inlinenoexcept

在文件 all_defs.cpp5264 行定义.

5264 {
5265 //假设x≥y
5266 if(x < y)swap(x, y);
5267
5268 size_t m=y.size_in_base_type();
5269 if(m <= 1)return base_gcd(move(x), move(y));//如果y只包含一位数(或根本没有),则使用其他方法求出结果
5270 T A, B, C, D;
5271 outer_loop:
5272 while(x && y) {//外循环
5273 --m;//提高精度
5274 T a = x.right_shift_in_base_type(m), b = y.right_shift_in_base_type(m);//取最显著数位
5275 /*初始化矩阵[A B a]为扩展的同一矩阵[1 0 a]
5276 [C D b] [0 1 b]
5277 */
5278 A = D = 1u; B = C = T{};
5279 //对(a+A,b+C)和(a+B,b+D)同时执行欧几里得算法,直到商不同为止
5280 do{//内循环
5281 const auto w = (a+A) / (b+C);//w为欧几里得算法长除法链中当前长除法的商
5282 {
5283 const auto w2 = (a+B) / (b+D);
5284 if(w != w2)break;
5285 }
5286 /*根据扩展欧几里得算法的矩阵表述替换当前矩阵[A B a]到矩阵积[0 1] [A B a] [C D a ]
5287 [C D b] ⋅ =
5288 [1 −w] [C D b] [A−wC B−wD a−wb]
5289 */
5290 A-=w*C;swap(A,C);
5291 B-=w*D;swap(B,D);
5292 a-=w*b;swap(a,b);
5293 }while(B);//B≠0则继续
5294 if(!B){//B=0意味着陷入了死锁;执行欧几里得算法的正常步骤,然后重新开始外循环
5295 x = swap(y, x%y);
5296 goto outer_loop;
5297 }
5298 //将对压缩形式的前数位执行的欧几里得算法步骤应用到x和y上
5299 auto new_x = A*x+B*y, new_y = C*x+D*y;
5300 x = move(new_x),y = move(new_y);
5301 }
5302 return x;
5303 }
auto base_gcd(T x, T y) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ log() [1/2]

template<arithmetic_type T>
constexpr auto elc::defs::base::math::log ( const T &  a)
inlineconstexprnoexcept

在文件 all_defs.cpp4564 行定义.

4564 {
4565 if(in_consteval||!is_basic_type<T>){
4566 typedef decltype(λ()noexcept{
4567 if constexpr(is_basic_type<T>)
4568 return ::std::log(T{});
4569 else
4570 return T{};
4571 }()) RT;
4572 auto log_impl = recursive_λ(const RT x,const RT y)noexcept -> RT{
4573 auto log_iter = λ(RT x,RT y)noexcept{
4574 const auto exp_y = exp(y);
4575 return y + T{2u}*(x-exp_y)/(x+exp_y);
4576 };
4577 return RT(is_close(y,log_iter(x,y)) ? y : self_recursion(x,log_iter(x,y)));
4578 };
4579 auto log_impl_caller = get_recursive_λ_caller(log_impl);
4580 return log_impl_caller((RT)a,RT{0u});
4581 }
4582 elseif constexpr(is_basic_type<T>)
4583 return ::std::log(a);
4584 }
函数调用图:
这是这个函数的调用关系图:

◆ log() [2/2]

template<arithmetic_type T, arithmetic_type U>
constexpr auto elc::defs::base::math::log ( const T &  a,
const U b 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4586 行定义.

4586 {
4587 return log(a)/log(b);
4588 }
constexpr auto log(const T &a) noexcept
函数调用图:

◆ mod()

template<arithmetic_type T1, arithmetic_type T2>
constexpr auto elc::defs::base::math::mod ( const T1 a,
const T2 b 
)
inlineconstexpr

求余

在文件 all_defs.cpp4437 行定义.

4437 {
4438 if constexpr(basic_float_type<T1>||basic_float_type<T2>)
4439 return ::std::fmod(a,b);
4440 else
4441 return a%b;
4442 }
函数调用图:
这是这个函数的调用关系图:

◆ pow() [1/2]

template<arithmetic_type T, arithmetic_type U = unsigned>
requires (!is_big_type<T>)
constexpr auto elc::defs::base::math::pow ( const T &  a,
const U b = 2 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4614 行定义.

4614 {
4615 if(in_consteval||!is_basic_type<T>){
4616 typedef decltype(::std::pow(a,b)) RT;
4617 return RT(exp(b*log(a)));
4618 }
4619 elseif constexpr(is_basic_type<T>)
4620 return ::std::pow(a,b);
4621 }
constexpr T exp(const T &v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ pow() [2/2]

template<big_type T, unsigned_integer_type U = unsigned>
constexpr auto elc::defs::base::math::pow ( a,
U  b = 2 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4623 行定义.

4623 {
4624 if constexpr(is_signed<T>){
4625 const bool isneg=is_negative(a) && is_odd(b);
4626 const auto abs_ret=pow(abs(a),b);
4627 return copy_as_negative(abs_ret,isneg);
4628 }
4629 else{
4630 T aret=1u;
4631 while(b){
4632 if(is_odd(b))aret*=a;
4633 a*=a;
4634 b>>=1u;
4635 }
4636 return aret;
4637 }
4638 }
函数调用图:

◆ quick_invsqrt()

template<float_type T>
constexpr T elc::defs::base::math::quick_invsqrt ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4694 行定义.

4694 {
4695 if constexpr(BIT_POSSIBILITY==2)// evil floating point bit level hacking
4696 if(!in_consteval)//编译期计算不能使用union_cast,让编译器慢慢算去吧
4697 if constexpr(is_big_type<T>)
4698 return quick_invsqrt(static_cast<long double>(v));
4699 else{
4700 using namespace basic_environment::float_infos;
4701 return union_cast<T>((quick_invsqrt_magic_number<T> - union_cast<const data_type<T>>(v))>>1);
4702 }
4703 return 2u/v;
4704 }
stream_T::data_type data_type
函数调用图:
这是这个函数的调用关系图:

◆ quick_sqrt()

template<float_type T>
constexpr T elc::defs::base::math::quick_sqrt ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4751 行定义.

4751 {
4752 if constexpr(BIT_POSSIBILITY==2)// evil floating point bit level hacking
4753 if(!in_consteval)//编译期计算不能使用union_cast,让编译器慢慢算去吧
4754 if constexpr(is_big_type<T>)
4755 return quick_sqrt(static_cast<long double>(v));
4756 else{
4757 using namespace basic_environment::float_infos;
4758 return union_cast<T>((union_cast<const data_type<T>>(v)>>1) + (data_type<T>(exponent_diff<T>) << (precision_base_bit<T> - 1)));
4759 }
4760 return v/2u;
4761 //return reciprocal(quick_invsqrt(v));
4762 }
constexpr T quick_sqrt(const T &v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ reciprocal()

template<basic_float_type T>
constexpr auto elc::defs::base::math::reciprocal ( const T &  x)
inlineconstexprnoexcept

倒数

在文件 all_defs.cpp4408 行定义.

4408 {
4409 return T{1}/x;
4410 }
函数调用图:
这是这个函数的调用关系图:

◆ reverse_sign()

template<arithmetic_type T>
constexpr auto elc::defs::base::math::reverse_sign ( const T &  x)
inlineconstexprnoexcept

符号位反转

在文件 all_defs.cpp4398 行定义.

4398 {
4399 return copy_as_negative(x,!is_negative(x));
4400 }
函数调用图:
这是这个函数的调用关系图:

◆ reverse_sign_if()

template<arithmetic_type T>
constexpr auto elc::defs::base::math::reverse_sign_if ( bool  x,
const T &  y 
)
inlineconstexprnoexcept

符号位反转,如果X为真

在文件 all_defs.cpp4403 行定义.

4403 {
4404 return x?reverse_sign(y):y;
4405 }
constexpr auto reverse_sign(const T &x) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ safe_arithmetic_cast()

template<arithmetic_type T, arithmetic_type U>
constexpr T elc::defs::base::math::safe_arithmetic_cast ( U  x)
inlineconstexprnoexcept

任意算数类型安全转型(ub避免.).

在文件 all_defs.cpp4413 行定义.

4413 {
4414 if constexpr(basic_float_type<U> && unsigned_type<T>)
4415 if(is_negative(x))
4416 return (T)(intmax_t)x;
4417 else{
4418 push_and_disable_msvc_warning(26467);//x已非负
4419 return (T)(uintmax_t)x;
4421 }
4422 else
4423 return (T)x;
4424 }
#define pop_msvc_warning()
Definition all_defs.cpp:478
#define push_and_disable_msvc_warning(...)
Definition all_defs.cpp:479
函数调用图:
这是这个函数的调用关系图:

◆ sec() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::sec ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5500 行定义.

5500 {
5502 }
constexpr T sec(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:

◆ sec() [2/2]

template<signed_float_type T>
constexpr T elc::defs::base::math::sec ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5496 行定义.

5496 {
5497 return reciprocal(cos(num, ε));
5498 }
函数调用图:
这是这个函数的调用关系图:

◆ set_rounding()

template<typename T >
constexpr void elc::defs::base::math::set_rounding ( int  mode)
inlineconstexpr

设置浮点舍入

在文件 all_defs.cpp4479 行定义.

4479 {
4480 if constexpr(basic_float_type<T>)
4481 ::std::fesetround(mode);
4482 }
函数调用图:
这是这个函数的调用关系图:

◆ sin() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::sin ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5437 行定义.

5437 {
5439 }
函数调用图:

◆ sin() [2/2]

template<signed_float_type T>
constexpr T elc::defs::base::math::sin ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5425 行定义.

5425 {
5426 size_t i = 1; bool negation = false; // 取反
5427 T base = num, result = num, num_pow = pow(num); // 求num2的次方
5428 while (abs(base) > ε) {
5429 base *= num_pow/((i+1)*(i+2)); // 求阶乘
5430 negation = !negation; // 每次循环取反
5431 result += reverse_sign_if(negation,base); // 求和
5432 i += 2;
5433 }
5434 return result;
5435 }
函数调用图:
这是这个函数的调用关系图:

◆ sqrt() [1/4]

template<float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::sqrt ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4779 行定义.

4779 {
4781 }
函数调用图:
这是这个函数的调用关系图:

◆ sqrt() [2/4]

template<integer_type T>
constexpr auto elc::defs::base::math::sqrt ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4783 行定义.

4783 {
4784 return sqrt(static_cast<float_type_of<T>>(v));
4785 }
函数调用图:

◆ sqrt() [3/4]

template<float_type T>
constexpr T elc::defs::base::math::sqrt ( const T &  v,
const to_unsigned_t< T > &  ε 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4771 行定义.

4771 {
4772 if constexpr(has_NaN<T> && has_inf<T>)
4773 if(v < 0u || v >= arithmetic_type_info_prover<T>::Inf())
4775 return sqrt_to_new_ε(quick_sqrt(v),v,ε);
4776 }
constexpr T sqrt_to_new_ε(T num, const U &v, const to_unsigned_t< T > &ε, to_unsigned_t< T > &ε_saver) noexcept
函数调用图:

◆ sqrt() [4/4]

template<float_type T>
constexpr T elc::defs::base::math::sqrt ( const T &  v,
const to_unsigned_t< T > &  ε,
to_unsigned_t< T > &  ε_saver 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4764 行定义.

4764 {
4765 if constexpr(has_NaN<T> && has_inf<T>)
4766 if(v < 0u || v >= arithmetic_type_info_prover<T>::Inf())
4768 return sqrt_to_new_ε(quick_sqrt(v),v,ε,ε_saver);
4769 }
函数调用图:

◆ sqrt_iteration()

template<float_type T, arithmetic_type U = T>
constexpr T elc::defs::base::math::sqrt_iteration ( const T &  num,
const U v 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4732 行定义.

4732 {
4733 //newton-raphson
4734 return (num+v/num)/2u;
4735 }
函数调用图:
这是这个函数的调用关系图:

◆ sqrt_to_new_ε() [1/2]

template<float_type T, arithmetic_type U = T>
constexpr T elc::defs::base::math::sqrt_to_new_ε ( num,
const U v,
const to_unsigned_t< T > &  ε 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4746 行定义.

4746 {
4747 auto ε_saver=to_unsigned_t<T>{ε*BIT_POSSIBILITY};
4748 return sqrt_to_new_ε(num,v,ε,ε_saver);
4749 }
函数调用图:

◆ sqrt_to_new_ε() [2/2]

template<float_type T, arithmetic_type U = T>
constexpr T elc::defs::base::math::sqrt_to_new_ε ( num,
const U v,
const to_unsigned_t< T > &  ε,
to_unsigned_t< T > &  ε_saver 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4737 行定义.

4737 {
4738 while(ε_saver>ε){
4739 auto next_ret=sqrt_iteration(num,v);
4740 ε_saver=abs(next_ret-num);
4741 num=move(next_ret);
4742 }
4743 return num;
4744 }
constexpr T sqrt_iteration(const T &num, const U &v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ sub()

template<arithmetic_type T1, arithmetic_type T2>
constexpr auto elc::defs::base::math::sub ( const T1 a,
const T2 b 
)
inlineconstexprnoexcept

在文件 all_defs.cpp4525 行定义.

4525 {
4526 if constexpr(is_basic_type<T1>&&is_basic_type<T2>){
4527 if constexpr(is_float_type<T1>||is_float_type<T2>)
4528 return a-b;
4529 else{
4530 using signedT = ::std::make_signed_t<::std::common_type_t<T1,T2,signed char>>;
4531 return static_cast<signedT>(a)-static_cast<signedT>(b);
4532 }
4533 }
4534 else
4535 return a-b;
4536 }
函数调用图:
这是这个函数的调用关系图:

◆ tan() [1/2]

template<signed_float_type T>
requires (has_ε<T>)
constexpr T elc::defs::base::math::tan ( num)
inlineconstexprnoexcept

在文件 all_defs.cpp5482 行定义.

5482 {
5484 }
constexpr T tan(T num, const to_unsigned_t< T > &ε) noexcept
函数调用图:

◆ tan() [2/2]

template<signed_float_type T>
constexpr T elc::defs::base::math::tan ( num,
const to_unsigned_t< T > &  ε 
)
constexprnoexcept

在文件 all_defs.cpp5478 行定义.

5478 {
5479 return sin(num, ε)/cos(num, ε);
5480 }
函数调用图:
这是这个函数的调用关系图:

◆ to_size_t()

template<arithmetic_type T>
constexpr size_t elc::defs::base::math::to_size_t ( x)
inlineconstexprnoexcept

任意算数类型转size_t

在文件 all_defs.cpp4427 行定义.

4427 {
4428 return safe_arithmetic_cast<size_t>(x);
4429 }
函数调用图:
这是这个函数的调用关系图:

◆ to_uintmax_t()

template<arithmetic_type T>
constexpr uintmax_t elc::defs::base::math::to_uintmax_t ( x)
inlineconstexprnoexcept

任意算数类型转uintmax_t

在文件 all_defs.cpp4432 行定义.

4432 {
4433 return safe_arithmetic_cast<uintmax_t>(x);
4434 }
函数调用图:
这是这个函数的调用关系图:

◆ trunc()

template<float_type T>
requires is_basic_type<T>
constexpr auto elc::defs::base::math::trunc ( const T &  v)
inlineconstexprnoexcept

在文件 all_defs.cpp4642 行定义.

4642 {
4643 if in_consteval{
4644 typedef decltype(::std::trunc(v)) RT;
4645 return static_cast<RT>((intmax_t)v);
4646 }
4647 else
4648 return ::std::trunc(v);
4649 }
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ get_prime_factorization

constexpr struct elc::defs::base::math::get_prime_factorization_t elc::defs::base::math::get_prime_factorization