- 



국제 무게 및 측정 국 (BIPM)에 의해 규제되고 SI 브로셔에 게시 된 국제 단위 시스템에 정의 된 물리적 값을 처리하기 위해 유형 안전 및 사용자 정의 리터럴을 제공하는 헤더 C ++ 라이브러리. 빠른 시작은 설치 안내서를 참조하십시오. 기부금과 의견을 환영합니다. 자세한 내용은 기여 지침을 확인하십시오.
예시 예 :
# include < SI/electric_charge.h >
# include < SI/mass.h >
using namespace SI ::literals ;
constexpr auto one_kilogram = 1 .0_kg;
constexpr auto ten_coulomb = 5 .0_A * 2 .0_s;
constexpr auto half_an_ampere = ten_coulomb / 20 .0_s;
constexpr auto thousand_grams = one_kilogram.as<SI:: gram_t >();
void calculate_mass ( const SI:: kilo_gram_t < long double > &kg) {
// do something meaningful here
}
int main ( int , char **) {
calculate_mass (one_kilogram);
return 0 ;
} SI는 컴파일 타임에 강한 유형 안전을 가진 국제 유닛 시스템의 값으로 전환 및 산술 운영을 제공합니다. 모든 단위는 템플릿 struct SI::unit_t 의 특수 유형입니다. 장치의 값 만 내부적으로 저장되며, 비율 (예 : Milli, Micro, Kilo ...)은 모든 유닛이 전체 구현 된 비율에 걸쳐 동일한 해상도를 가질 수 있도록 유형 특성으로 결정됩니다. SI는 비율이 다른 시점뿐만 아니라 동일한 비율의 단위 운영을 처리합니다. 자세한 내용은 문서 구현 세부 정보를 참조하십시오. 동일한 비율의 단위 간의 작업은 오버 헤드가 없으므로 값을 장치로 조정하는 데 추가 계산 비용이 있습니다. 플래그를 전달 SI_DISABLE_IMPLICIT_RATIO_CONVERSION 으로 컴파일러 암시 적 비율 변환으로 전환하는 것은 수행되지 않으며 컴파일러 오류로 실패합니다. 기준 측정과 SI 구현을 비교하려면 연속 벤치 마크 결과를 참조하십시오.
내장 유형에 사용자 정의 비율을 공급할 수 있으며 다른 장치와 계산하기 위해 완전히 호환됩니다. 그러나 필요한 리터럴 또는 타이핑은 사용자가 제공해야합니다. 예를 들어 SI::velocity_t<double, std::ratio<1000, 36>> 은 "100 시간당 킬로미터입니다.
단위 간 변환은 unit_ 의 as<unit_t>() 멤버 함수로 수행됩니다 SI::unit_cast<unit_t>(unit_t u) 이것은 동일한 유형의 값이 있지만 다른 비율의 값을 변환합니다.
각 단위에 대해 사용 가능한 리터럴은 밑줄과 함께 접두사로 구현 된 비율입니다. 즉, _mm . _km . 일반적으로 비율은 국제 단위 시스템의 메트릭 접두사를 따릅니다. TypEdefs는 표준 메트릭 접두사와 접두사 (또는 드문 경우)입니다. 즉 metre_t, milli_metre_t, kilo_metre_t . 접두사 또는 인터 픽스는 아래 테이블에 * 로 표시되어 있습니다. typedefs 및 literals를 정의한 장치는 스트림 연산자 또는 SI::to_string 함수를 사용하여 문자열로 변환 할 수 있습니다. 스트림 연산자를 사용하려면 헤더 파일 SI/stream.h 를 포함하십시오.
| 단위 | 치수 기호 | 단위 기호 | 구현 비율 | 단위 typedefs |
|---|---|---|---|---|
| 길이 | 엘 | 중 | 10-18 ~ 10 18 | *_metre_t |
| 시간 | 티 | 에스 | 10-18 ~ 10 0 및 60/1, 3600/1 | *_seconds_t, minutes_t, hours_t |
| 대량의* | 중 | kg | 10-15 ~ 10 18 | *_gram_t , *_ton_t |
| 전류 | 나 | 에이 | 10-18 ~ 10 18 | *_ampere_t |
| 열역학적 온도 ** | 티 | 케이 | 10-18 ~ 10 18 | *_kelvin_t |
| 물질의 양 | N | 몰 | 10-18 ~ 10 18 | *_mol_t |
| 밝기 | J. | CD | 10-18 ~ 10 18 | *_candela_t |
* 질량의 경우 기본 비율은 SI 단위 테이블에 정의 된대로 kg ( g )입니다. 따라서 문자 접두사와 내부 표현 사이에는 불일치가 있습니다.
** 열역학적 온도의 치수 기호는 Θ (Theta) 이어야하지만 현재 구현은 비 ASCII 기호 또는 다중 문자 기호를 허용하지 않습니다.
| 단위 | 치수 기호 | 멱지수 | 단위 기호 | 구현 비율 | 단위 typedefs |
|---|---|---|---|---|---|
| 영역 | 엘 | 2 | M2 | 10-18 ~ 10 18 | square_*_metre_t |
| 용량 | 엘 | 3 | M3 | 10-18 ~ 10 18 | cubic_*_metre_t |
| 빈도 | 티 | -1 | HZ | 10-18 ~ 10 18 | *_hertz_t |
| 각도* | 아르 자형 | 1 | 라드 | 10-18 ~ 1 | *_radian_t |
| 각도 (도)* | 아르 자형 | 1 | DEG | 마이크로, 밀리, 1 | *_radian_t |
| 고체 각도* | 아르 자형 | 1 | SR | 10-18 ~ 1 | *_steradian_t |
* 각도, 각도 (도) 및 고형 각도는 간단한 컨테이너이며, 2* PI 이후의 오버플로와 같은 각도/고형 발진 계산을 수행하는 기능을 포함하지 않습니다. 라디안과 학위를 전환하면 정밀도가 상실 될 수 있습니다. 특히 long doubles 으로 작업하는 경우 비율이 충분히 정확하지 않기 때문에 긴 INT로 표시되어야하므로 비율이 충분히 정확하지 않기 때문입니다.
다른 장치에서 구축 할 수있는 모든 장치는 수학적 작동을 반전시켜 각 장치로 부패합니다. Q = I * T 이면 Q / I = T 및 Q / T = I
| 단위 | 치수 기호 | 단위 기호 | 제작 가능 | 구현 된 리터럴 | 단위 typedefs |
|---|---|---|---|---|---|
| 속도 | 다섯 | m/s | l / t | m_p_s , km_p_h , _c | metre_per_second_t , kilometre_per_second_t , speed_of_light_t |
| 가속 | 에이 | m/s^2 | v / t, v^2 / l | 없음 | 없음 |
| 전하 | 큐 | 기음 | 그것 | AC에서 EC | *_coulomb_t |
| 전위 | 유 | 다섯 | P / I, E / Q | av to ev | *_volt_t |
| 전기 저항 | 영형* | 옴 (ω) | u / i, 1 / g | aohm to eohm | *_ohm_t |
| 전기 전도도 | G | 에스 | I / u, 1 / r | es | *_siemens_t |
| 전기 용량 | 기음 | 에프 | Q / U | af to ef | *_farad_t |
| 힘 | 에프 | N | m * a | en | *_newton_t |
| 압력 | 피 | 아빠 | f / l^2 | APA에서 EPA | *_pascal_t |
| 에너지 | 이자형 | J. | f * l, p * l^3 | aj to ej | *_joule_t |
| 힘 | 피 | w | e/t | ew에 아 | *_watt_t |
| 자기 플럭스 | 에프* | WB | u * t | AWB에서 EWB | *_weber_t |
| 자기장 | 비 | 티 | f/l^2 | at et | *_tesla_t |
| 기세 | 영형* | kg⋅m/s | m * v | 없음 | 없음 |
| 인덕턴스 | 엘 | 시간 | f / i | 아에 | *_henry_t |
| 빛나는 플럭스 | 중* | LM | J * r | Alm to Elm | *_lumen_t |
| 휘도 | 나* | LX | M / A | Alx to Elx | *_lux_t |
| 방사능 | 에이 | BQ | ABQ에서 EBQ | *_becquerel_t | |
| 흡수 된 용량 | 디 | Gy | Agy to Egy | *_gray_t | |
| 동등한 복용량 | 시간 | SV | asv to esv | *_sievert_t | |
| 촉매 활성 | 케이 | 카트 | n / t | akat to ekat | *_katal_t |
| 표면 흐름 | 에스 | m^2/s | l^2 / t | 없음 | |
| 체적 흐름 | 다섯 | m^3/s | l^3 / t | 없음 | |
| 각도 주파수 | w* | rad/s | r / t | 없음 |
* 현재 구현은 비 ASCII 기호 또는 다중 문자 기호를 허용하지 않기 때문에 이러한 차원에는 아직 올바른 기호가 없습니다. 전기 저항의 치수 기호는 Ω (Ohm) 및 자기 플럭스 Φ (Phi) 여야합니다. 휘도는 e b 이어야합니다. 각속도는 ω (오메가) 여야합니다. 빛나는 플럭스는 φ v 여야하며, 이는 Φ (Phi) 자체보다 훨씬 덜지지되어야합니다.
비 표준 단위는 BIPM에 의해 규제되지 않지만 SI 표준과 함께 사용하도록 허용됩니다.
| 단위 | 치수 기호 | 리터럴 | 구현 비율 | 단위 typedefs |
|---|---|---|---|---|
| 천문학 길이 | 엘 | AU, LY, PC | 149597870691 : 1 (au), 9460730777119564 : 1 (ly), 30856775814913700 : 1 (PC) | astronomic_unit_t ( _AU ), lightyear_t ( _ly ), parsec_t ( _pc ) |
SI는 C ++ 17 기능을 사용하는 헤더 전용 라이브러리입니다. 빌딩은 CMAKE> 3.23을 사용하여 테스트하고 G ++ 7, G ++ 8, Clang5, Clang6, Clang7, MSVC 19 및 AppleClang 10.0에 대해 검증됩니다. Conan 2.0을 사용하여 테스트를 위해 종속성을 다운로드하는 것이 좋습니다. 그러나 테스트가 구축되지 않은 경우 사용하지 않고 사용할 수 있습니다.
Si는 Cmakedeps 생성기를 사용하여 종속성을 찾습니다. 의존성 사용을 설치합니다
conan install . --output-folder=build --build=missing --settings=build_type=Debug 대체 --settings=build_type=Debug --settings=build_type=Release .
cmakedeps 생성기를 사용하면 수동으로 빌드하거나 제공된 CMAKE 사전 설정을 사용할 수 있습니다.
cmake --preset=ci-ninja-debug
cmake --build build SI의 기본 설치 위치는 /usr/local/lib/SI 입니다. SI는 RAW CMAKE, CPACK (CMAKES 패키지 메커니즘) 또는 Conan Center에서 제공하는 Conan.io 패키지로 설치할 수 있습니다.
자세한 지침은 설치 안내서를 참조하십시오
참고 : SI를 코난 패키지로 얻는 것이 선호됩니다.
Cmake의 FetchContent와 함께 설치하려면 cmakelists.txt에 다음을 추가하십시오.
include (FetchContent)
FetchContent_Declare(
SI
GIT_REPOSITORY https://gitlab.com/bernedom/SI.git
# This will get the latest version
# To pin to a specific version or hash, add the version/hash here instead
# (e.g. 2.5.1 or 63b267211a6f256f7ba8d5a26e17138bbcf95ba8)
GIT_TAG main
)
FetchContent_MakeAvailable(SI)
# ...
# Link the library to your target. Change this as needed!
target_link_libraries ( ${PROJECT_NAME} PUBLIC SI::SI)SI는이 저장소에서 '원시'다운로드로 제공되지만 Conan 패키지로도 제공됩니다. Conan-Center에서 SI를 얻는 것이 선호하는 방법입니다.
자세한 내용과 더 깊은 기술적 세부 사항은 구현 세부 정보 문서를 참조하십시오.
2.0.0 이상의 버전은 Changelog에 언급 된 변화로 인해 이전 버전과 완전히 호환되지 않습니다. Conan 패키지의 버전 2.0.0에서 Conan Naming Convention을 준수하기 위해 소문자 si 로 선정되었습니다.