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

命名空间

namespace  float_infos
 

class  to_arithmetic_t
 

概念

concept  is_elc_expansion_base_type
 

类型定义

typedef bool bit_type
 
typedef ::std::uintmax_t basic_uintmax_t
 
typedef ::std::intmax_t basic_intmax_t
 
typedef decltype(λ{ return basic_uintmax_t{};}()) uintmax_t
 
typedef decltype(λ{ return basic_intmax_t{};}()) intmax_t
 
typedef basic_uintmax_t uintmax_index_t
 
typedef basic_intmax_t intmax_index_t
 
template<size_t size>
using unsigned_specific_size_t = decltype(λ{ if constexpr(size==sizeof(uint8_t)) return(uint8_t) 0
 
template<size_t size>
using unsigned_specific_size_fast_t = decltype(λ{ if constexpr(size<=sizeof(uint_fast8_t)) return(uint_fast8_t) 0
 
template<size_t size>
using signed_specific_size_t = decltype(λ{ if constexpr(size==sizeof(int8_t)) return(int8_t) 0
 
template<size_t size>
using signed_specific_size_fast_t = decltype(λ{ if constexpr(size<=sizeof(int_fast8_t)) return(int_fast8_t) 0
 
template<basic_float_type T>
using float_precision_base_t = decltype(get_precision_base< T >())
 
template<basic_float_type T>
using float_exponent_t = signed_specific_size_fast_t< sizeof(float_infos::exponent_type< T >)+1 >
 

函数

constexpr bool is_rounding_bit (bit_type v) noexcept
 
template<class T >
constexpr bool is_elc_expansion_base_type_helper () noexcept
 
else if constexpr (size==sizeof(uint16_t)) return(uint16_t) 0
 
else if constexpr (size<=sizeof(uint_fast16_t)) return(uint_fast16_t) 0
 
else if constexpr (size<=sizeof(uint_fast32_t)) return(uint_fast32_t) 0
 
else if constexpr (size<=sizeof(uint_fast64_t)) return(uint_fast64_t) 0
 
else if constexpr (size<=sizeof(int_fast16_t)) return(int_fast16_t) 0
 
else if constexpr (size<=sizeof(int_fast32_t)) return(int_fast32_t) 0
 
else if constexpr (size<=sizeof(int_fast64_t)) return(int_fast64_t) 0
 
template<unsigned_basic_integer_type T>
constexpr bool add_carry (T a, T b, T &c) noexcept
 
template<unsigned_basic_integer_type T>
constexpradd_carry (T a, T b, bool &is_overflow) noexcept
 
template<unsigned_basic_integer_type T>
constexpradd_carry (T a, bool &is_overflow) noexcept
 
template<unsigned_basic_integer_type T>
constexpr bool sub_borrow (T a, T b, T &c) noexcept
 
template<unsigned_basic_integer_type T>
constexprsub_borrow (T a, T b, bool &is_underflow) noexcept
 
template<unsigned_basic_integer_type T>
constexprsub_borrow (T a, bool &is_underflow) noexcept
 
template<basic_float_type T>
constexpr auto get_native_precision (T v) noexcept
 
template<basic_float_type T>
constexpr auto get_precision_base (T=T{}) noexcept
 
template<basic_float_type T>
constexpr auto base_get_exponent (T v) noexcept
 
template<basic_float_type T>
constexpr float_infos::exponent_type< T > get_native_exponent (T v) noexcept
 
template<basic_float_type T>
constexpr float_precision_base_t< T > get_base_num (T v) noexcept
 
template<basic_float_type T>
constexpr float_precision_base_t< T > get_precision (T v) noexcept
 
template<basic_float_type T>
constexpr float_exponent_t< T > get_exponent (T v) noexcept
 
template<basic_float_type T>
constexpr auto get_precision_and_exponent (T v) noexcept
 
template<basic_float_type T>
constexprmake_float (float_precision_base_t< T > base_num, float_exponent_t< T > exponent) noexcept
 

变量

constexpr size_t BIT_POSSIBILITY =1<<1
 每个bit(不是字节)的可能性 为什么c艹委员会不定义这个?
 
 else
 
constexpr class elc::defs::basic_environment::to_arithmetic_t to_arithmetic
 
constexpr bool wchar_t_same_as_char_t =sizeof(wchar_t)==sizeof(char_t)
 
constexpr bool wchar_t_same_as_char16_t =sizeof(wchar_t)==sizeof(char16_t)
 
template<basic_float_type T>
constexpr auto threshold_precision_bit =float_infos::precision_base_bit<T>+1
 

类型定义说明

◆ basic_intmax_t

在文件 all_defs.cpp3402 行定义.

◆ basic_uintmax_t

在文件 all_defs.cpp3401 行定义.

◆ bit_type

◆ float_exponent_t

◆ float_precision_base_t

◆ intmax_index_t

◆ intmax_t

◆ signed_specific_size_fast_t

至少有给定大小的快速有符号整数类型

在文件 all_defs.cpp6410 行定义.

◆ signed_specific_size_t

给定大小的有符号整数类型

在文件 all_defs.cpp6355 行定义.

◆ uintmax_index_t

◆ uintmax_t

◆ unsigned_specific_size_fast_t

至少有给定大小的快速无符号整数类型

在文件 all_defs.cpp6307 行定义.

◆ unsigned_specific_size_t

给定大小的无符号整数类型

在文件 all_defs.cpp6248 行定义.

函数说明

◆ add_carry() [1/3]

template<unsigned_basic_integer_type T>
constexpr T elc::defs::basic_environment::add_carry ( a,
bool is_overflow 
)
inlineconstexprnoexcept

在文件 all_defs.cpp7435 行定义.

7435 {
7436 #if HAS_MSVC_INTRINSICS
7437 if(!in_consteval){
7438 T c;is_overflow=_msvc_builtin_add_carry(is_overflow, a, T{}, &c);
7439 return c;
7440 }
7441 else
7442 #endif
7443 {
7444 T c=a+is_overflow;
7445 if(c)//若c为0,保持is_overflow不变(原理见上)
7446 is_overflow=false;
7447 return c;
7448 }
7449}
#define in_consteval
Definition all_defs.cpp:717
函数调用图:

◆ add_carry() [2/3]

template<unsigned_basic_integer_type T>
constexpr T elc::defs::basic_environment::add_carry ( a,
b,
bool is_overflow 
)
inlineconstexprnoexcept

在文件 all_defs.cpp7412 行定义.

7412 {
7413 #if HAS_MSVC_INTRINSICS
7414 if(!in_consteval){
7415 T c;is_overflow=_msvc_builtin_add_carry(is_overflow, a, b, &c);
7416 return c;
7417 }
7418 else
7419 #endif
7420 {
7421 T c=a+is_overflow;
7422 if(c){
7423 is_overflow=add_carry(c,b,c);
7424 return c;
7425 }
7426 else{
7427 //现在我们得知a+is_overflow的结果为0:
7428 //若is_overflow为true,溢出确实发生了,我们需要将is_overflow设置为true,所以什么都不用管
7429 //若is_overflow为false,溢出没有发生,我们需要将is_overflow设置为false,我们仍然什么都不用管
7430 return b;
7431 }
7432 }
7433}
函数调用图:

◆ add_carry() [3/3]

template<unsigned_basic_integer_type T>
constexpr bool elc::defs::basic_environment::add_carry ( a,
b,
T &  c 
)
inlineconstexprnoexcept

在文件 all_defs.cpp7382 行定义.

7382 {
7383 if(!in_consteval){
7384 #if HAS_GCC_BUILTINS
7385 return __builtin_add_overflow(a, b, &c);
7386 #elif HAS_MSVC_INTRINSICS
7387 return _msvc_builtin_add_carry(0, a, b, &c);
7388 #elif HAS_X86_ASM
7389 //x86/x86-64
7390 __asm__ (
7391 "add %2, %1\n\t"
7392 "setc %0\n\t"
7393 : "=r"(c)
7394 : "r"(a), "r"(b)
7395 );
7396 return c;
7397 #elif HAS_ARM_ASM || HAS_ARM64_ASM
7398 //arm/arm64
7399 __asm__ (
7400 "adds %1, %1, %2\n\t"
7401 "adc %0, xzr, xzr\n\t"
7402 : "=r"(c)
7403 : "r"(a), "r"(b)
7404 );
7405 return c;
7406 #endif
7407 }
7408 c = a + b;
7409 return c < a;
7410}
函数调用图:
这是这个函数的调用关系图:

◆ base_get_exponent()

template<basic_float_type T>
constexpr auto elc::defs::basic_environment::base_get_exponent ( v)
inlineconstexprnoexcept

在文件 all_defs.cpp7566 行定义.

7566 {
7567 using namespace float_infos;
7568 auto tmp=get_float_data(v);
7569 tmp&=exponent_mask<T>;
7570 tmp>>=precision_base_bit<T>;
7571 return exponent_unsigned_type<T>(tmp);
7572 }
函数调用图:
这是这个函数的调用关系图:

◆ constexpr() [1/7]

else if elc::defs::basic_environment::constexpr ( size<=  sizeofint_fast16_t)

◆ constexpr() [2/7]

else if elc::defs::basic_environment::constexpr ( size<=  sizeofint_fast32_t)

◆ constexpr() [3/7]

else if elc::defs::basic_environment::constexpr ( size<=  sizeofint_fast64_t)

◆ constexpr() [4/7]

else if elc::defs::basic_environment::constexpr ( size<=  sizeofuint_fast16_t)

◆ constexpr() [5/7]

else if elc::defs::basic_environment::constexpr ( size<=  sizeofuint_fast32_t)

◆ constexpr() [6/7]

else if elc::defs::basic_environment::constexpr ( size<=  sizeofuint_fast64_t)

◆ constexpr() [7/7]

else if elc::defs::basic_environment::constexpr ( size  = =sizeof(uint16_t))

◆ get_base_num()

template<basic_float_type T>
constexpr float_precision_base_t< T > elc::defs::basic_environment::get_base_num ( v)
inlineconstexprnoexcept

在文件 all_defs.cpp7583 行定义.

7583 {
7584 //特殊情况处理(exp=0时,base=0)
7585 const auto tmp=base_get_exponent(v);
7586 return tmp?get_precision_base(v):float_precision_base_t<T>{};
7587 }
decltype(get_precision_base< T >()) float_precision_base_t
constexpr auto base_get_exponent(T v) noexcept
constexpr auto get_precision_base(T=T{}) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ get_exponent()

template<basic_float_type T>
constexpr float_exponent_t< T > elc::defs::basic_environment::get_exponent ( v)
inlineconstexprnoexcept

在文件 all_defs.cpp7595 行定义.

7595 {
7596 using namespace float_infos;
7597 return float_exponent_t<T>(get_native_exponent(v)) - precision_base_bit<T>;
7598 }
constexpr float_infos::exponent_type< T > get_native_exponent(T v) noexcept
signed_specific_size_fast_t< sizeof(float_infos::exponent_type< T >)+1 > float_exponent_t
函数调用图:
这是这个函数的调用关系图:

◆ get_native_exponent()

template<basic_float_type T>
constexpr float_infos::exponent_type< T > elc::defs::basic_environment::get_native_exponent ( v)
inlineconstexprnoexcept

在文件 all_defs.cpp7575 行定义.

7575 {
7576 const auto tmp=base_get_exponent(v);
7577 using namespace float_infos;
7578 if(tmp==0)return exponent_min<T>;
7579 else return exponent_type<T>(tmp)-exponent_diff<T>;
7580 }
函数调用图:
这是这个函数的调用关系图:

◆ get_native_precision()

template<basic_float_type T>
constexpr auto elc::defs::basic_environment::get_native_precision ( v)
inlineconstexprnoexcept

在文件 all_defs.cpp7549 行定义.

7549 {
7550 using namespace float_infos;
7551 auto tmp=get_float_data(v);
7552 tmp&=precision_mask<T>;
7553 return tmp;
7554 }
函数调用图:
这是这个函数的调用关系图:

◆ get_precision()

template<basic_float_type T>
constexpr float_precision_base_t< T > elc::defs::basic_environment::get_precision ( v)
inlineconstexprnoexcept

在文件 all_defs.cpp7590 行定义.

7590 {
7592 }
constexpr auto get_native_precision(T v) noexcept
constexpr float_precision_base_t< T > get_base_num(T v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ get_precision_and_exponent()

template<basic_float_type T>
constexpr auto elc::defs::basic_environment::get_precision_and_exponent ( v)
inlineconstexprnoexcept

在文件 all_defs.cpp7601 行定义.

7601 {
7602 struct precision_and_exponent_t{
7603 float_precision_base_t<T> precision;
7604 float_exponent_t<T> exponent;
7605 };
7606 const auto precision=get_precision(v);
7607 const auto exponent=get_exponent(v);
7608 return precision_and_exponent_t{precision,exponent};
7609 }
函数调用图:
这是这个函数的调用关系图:

◆ get_precision_base()

template<basic_float_type T>
constexpr auto elc::defs::basic_environment::get_precision_base ( = T{})
inlineconstexprnoexcept

在文件 all_defs.cpp7557 行定义.

7557 {})noexcept{
7558 return float_infos::precision_base<T>;
7559 }
这是这个函数的调用关系图:

◆ is_elc_expansion_base_type_helper()

template<class T >
constexpr bool elc::defs::basic_environment::is_elc_expansion_base_type_helper ( )
inlineconstexprnoexcept

在文件 all_defs.cpp6234 行定义.

6234 {
6235 #if defined(ELC_BASE_ENV_HAS_INT128)
6236 if constexpr(sizeof(basic_uintmax_t) < sizeof(uint128_t) && type_info<T> == type_info<uint128_t>)
6237 return true;
6238 if constexpr(sizeof(basic_intmax_t) < sizeof(int128_t) && type_info<T> == type_info<int128_t>)
6239 return true;
6240 #endif
6241 return false;
6242 }
::std::uintmax_t basic_uintmax_t
::std::intmax_t basic_intmax_t
函数调用图:

◆ is_rounding_bit()

constexpr bool elc::defs::basic_environment::is_rounding_bit ( bit_type  v)
inlineconstexprnoexcept

在文件 all_defs.cpp3373 行定义.

3373 {
3374 if constexpr(BIT_POSSIBILITY==2)
3375 return v;
3376 else{
3378 return v>=BIT_POSSIBILITY/2;
3380 }
3381 }
#define pop_msvc_warning()
Definition all_defs.cpp:478
#define push_and_disable_msvc_warning(...)
Definition all_defs.cpp:479
constexpr size_t BIT_POSSIBILITY
每个bit(不是字节)的可能性 为什么c艹委员会不定义这个?
函数调用图:
这是这个函数的调用关系图:

◆ make_float()

template<basic_float_type T>
constexpr T elc::defs::basic_environment::make_float ( float_precision_base_t< T >  base_num,
float_exponent_t< T >  exponent 
)
inlineconstexprnoexcept

在文件 all_defs.cpp7616 行定义.

7616 {
7617 using namespace float_infos;
7618 //首先将基数转换为precision_base(2^precision_base_bit)为分母的分数的分子
7619 //并在此过程中加减指数
7620 //需要注意的是,这里的基数是包含1的,所以转换目标是base_num>>precision_base_bit为1
7621 {
7622 const auto tmp=countl_zero(base_num);
7623 constexpr auto need_shift=bitnum_of(base_num)-threshold_precision_bit<T>;
7624 const float_exponent_t<T> shift=float_exponent_t<T>(tmp)-need_shift;
7625 if(shift>0){
7626 base_num<<=shift;
7627 exponent-=shift;
7628 }
7629 elseif(shift<0){
7630 base_num>>=-shift;
7631 exponent-=shift;
7632 }
7633 }
7634 //适当放缩后,需要偏移指数部分,原因如下:
7635 //原有逻辑是num=base_num*2^exponent,这是大分数的表达逻辑
7636 //但是浮点数的逻辑是num=(base_num/precision_base)*2^exponent
7637 //将precision_base合并到exponent中,即可得到浮点数的逻辑
7638 exponent+=precision_base_bit<T>;
7639 if(exponent < exponent_min<T>){//指数过小,需要舍去
7640 const auto diff=exponent_min<T> - exponent;
7641 base_num>>=diff;
7642 exponent+=diff;
7643 if(!base_num)return 0;//基数过小,无法表示
7644 }
7645 if(exponent>exponent_max<T>)return 0;//指数过大,无法表示
7646 //DEN情况判断
7647 const bool is_den=!(base_num>>precision_base_bit<T>);//若基数最高位为0,则exponent一定为exponent_min,不用判断
7648 if(is_den)
7649 return get_float_from_data<T>(base_num);
7650 else{//非DEN情况下,根据浮点数表示规则去掉基数多余的1
7651 const auto exp=exponent_unsigned_type<T>(exponent+exponent_diff<T>);
7652 base_num-=get_precision_base<T>();
7653 data_type<T> data=base_num;
7654 data|=data_type<T>(exp)<<precision_base_bit<T>;
7655 return get_float_from_data<T>(data);
7656 }
7657 }
#define bitnum_of(...)
Definition all_defs.cpp:578
#define elseif
Definition all_defs.cpp:650
constexpr size_t countl_zero(const T v) noexcept
countl_zero
constexpr T exp(const T &v) noexcept
函数调用图:
这是这个函数的调用关系图:

◆ sub_borrow() [1/3]

template<unsigned_basic_integer_type T>
constexpr T elc::defs::basic_environment::sub_borrow ( a,
bool is_underflow 
)
inlineconstexprnoexcept

在文件 all_defs.cpp7505 行定义.

7505 {
7506 #if HAS_MSVC_INTRINSICS
7507 if(!in_consteval){
7508 T c;is_underflow=_msvc_builtin_sub_borrow(is_underflow, a, T{}, &c);
7509 return c;
7510 }
7511 else
7512 #endif
7513 {
7514 if(is_underflow){
7515 is_underflow=!a;
7516 return a-1;
7517 }
7518 else
7519 return a;
7520 }
7521}
函数调用图:

◆ sub_borrow() [2/3]

template<unsigned_basic_integer_type T>
constexpr T elc::defs::basic_environment::sub_borrow ( a,
b,
bool is_underflow 
)
inlineconstexprnoexcept

在文件 all_defs.cpp7482 行定义.

7482 {
7483 #if HAS_MSVC_INTRINSICS
7484 if(!in_consteval){
7485 T c;is_underflow=_msvc_builtin_sub_borrow(is_underflow, a, b, &c);
7486 return c;
7487 }
7488 else
7489 #endif
7490 {
7491 T c=b+is_underflow;
7492 if(c){
7493 is_underflow=sub_borrow(a,c,c);
7494 return c;
7495 }
7496 else{
7497 //现在我们得知b+is_underflow的结果为0:
7498 //若is_underflow为true,溢出肯定该发生,我们需要将is_underflow设置为true,所以什么都不用管
7499 //若is_underflow为false,溢出不会发生,我们需要将is_underflow设置为false,我们仍然什么都不用管
7500 return a;
7501 }
7502 }
7503}
函数调用图:

◆ sub_borrow() [3/3]

template<unsigned_basic_integer_type T>
constexpr bool elc::defs::basic_environment::sub_borrow ( a,
b,
T &  c 
)
inlineconstexprnoexcept

在文件 all_defs.cpp7452 行定义.

7452 {
7453 if(!in_consteval){
7454 #if HAS_GCC_BUILTINS
7455 return __builtin_sub_overflow(a, b, &c);
7456 #elif HAS_MSVC_INTRINSICS
7457 return _msvc_builtin_sub_borrow(0, a, b, &c);
7458 #elif HAS_X86_ASM
7459 //x86/x86-64
7460 __asm__ (
7461 "sub %2, %1\n\t"
7462 "setc %0\n\t"
7463 : "=r"(c)
7464 : "r"(a), "r"(b)
7465 );
7466 return c;
7467 #elif HAS_ARM_ASM || HAS_ARM64_ASM
7468 //arm/arm64
7469 __asm__ (
7470 "subs %1, %1, %2\n\t"
7471 "sbc %0, xzr, xzr\n\t"
7472 : "=r"(c)
7473 : "r"(a), "r"(b)
7474 );
7475 return c;
7476 #endif
7477 }
7478 c = a - b;
7479 return c > a;
7480}
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ BIT_POSSIBILITY

constexpr size_t elc::defs::basic_environment::BIT_POSSIBILITY =1<<1
constexpr

每个bit(不是字节)的可能性 为什么c艹委员会不定义这个?

在文件 all_defs.cpp3370 行定义.

◆ else

elc::defs::basic_environment::else
初始值:
{}
}())

在文件 all_defs.cpp6297 行定义.

6303 {}
6304 }());

◆ threshold_precision_bit

template<basic_float_type T>
constexpr auto elc::defs::basic_environment::threshold_precision_bit =float_infos::precision_base_bit<T>+1
constexpr

在文件 all_defs.cpp7612 行定义.

◆ to_arithmetic

constexpr class elc::defs::basic_environment::to_arithmetic_t elc::defs::basic_environment::to_arithmetic

◆ wchar_t_same_as_char16_t

constexpr bool elc::defs::basic_environment::wchar_t_same_as_char16_t =sizeof(wchar_t)==sizeof(char16_t)
inlineconstexpr

在文件 all_defs.cpp7324 行定义.

◆ wchar_t_same_as_char_t

constexpr bool elc::defs::basic_environment::wchar_t_same_as_char_t =sizeof(wchar_t)==sizeof(char_t)
inlineconstexpr

在文件 all_defs.cpp7322 行定义.