- 



Uma biblioteca C ++ apenas de cabeçalho que fornece literais de segurança e usuário definidos pelo usuário para lidar com valores físicos definidos no sistema internacional de unidades regulamentadas pelo Bureau Internacional de Pesos e Medidas (BIPM) e publicado na brochura do SI. Para começar rápido, consulte o guia de instalação. Contribuições e comentários são bem -vindos, verifique as diretrizes de contribuição para obter mais informações.
Um exemplo ilustrativo:
# 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 ;
} O SI fornece conversões e operações aritméticas com valores de qualquer sistema internacional de unidades com forte segurança do tipo no momento da compilação . Todas as unidades são tipedefs especiais do modelo Struct SI::unit_t . Somente o valor da unidade é armazenado internamente, a proporção (ou seja, Milli, Micro, Kilo ...) é determinada como uma característica de tipo para permitir que todas as unidades tenham a mesma resolução em todas as proporções implementadas. O SI lida com operações de unidades das mesmas proporções, bem como quando as proporções são diferentes. Consulte os detalhes da implementação da documentação para obter mais informações. As operações entre unidades da mesma proporção são livres de sobrecarga, caso contrário, há um custo de computação adicional para ajustar os valores às unidades. Passando o sinalizador SI_DISABLE_IMPLICIT_RATIO_CONVERSION para a conversão de razão implícita do compilador não é feito e falha com um erro do compilador. Consulte os resultados contínuos de referência para uma comparação entre as medições de referência e a implementação no SI.
É possível fornecer taxas personalizadas para os tipos internos e eles são totalmente compatíveis para cálculo com outras unidades. No entanto, os literais ou tipedefs necessários devem ser fornecidos pelo usuário. Por exemplo SI::velocity_t<double, std::ratio<1000, 36>> seria "quilômetro por centésimo de uma hora".
A conversão entre as unidades é feita com a função as<unit_t>() membro da unit_ ou a função gratuita SI::unit_cast<unit_t>(unit_t u) . Isso converterá um valor do mesmo tipo, mas uma proporção diferente.
Para cada unidade, os literais disponíveis são os índices implementados prefixados com um sublinhado. ou seja, _mm . _km . Geralmente, as proporções seguem prefixos métricos do sistema internacional de unidades, os typedefs são prefixados (ou em casos raros interfixados) com os prefixos métricos padrão. ou seja metre_t, milli_metre_t, kilo_metre_t . O prefixo ou interfixo é marcado com um * nas tabelas abaixo. As unidades que definiram typedefs e literais podem ser convertidas em strings usando operadores de fluxo ou a função SI::to_string . Para usar os operadores de fluxo, inclua o arquivo de cabeçalho SI/stream.h
| Unidade | Símbolo da dimensão | Símbolo da unidade | índices implementados | unidade typedefs |
|---|---|---|---|---|
| Comprimento | L | m | 10 -18 a 10 18 | *_metre_t |
| Tempo | T | s | 10 -18 a 10 0 e 60/1, 3600/1 | *_seconds_t, minutes_t, hours_t |
| Massa* | M | kg | 10 -15 a 10 18 | *_gram_t , *_ton_t |
| Corrente elétrica | EU | UM | 10 -18 a 10 18 | *_ampere_t |
| Temperatura termodinâmica ** | t | K | 10 -18 a 10 18 | *_kelvin_t |
| Quantidade de substância | N | mol | 10 -18 a 10 18 | *_mol_t |
| Luminosidade | J | cd | 10 -18 a 10 18 | *_candela_t |
* Para massa, a relação base é kg (não g ), conforme definido na tabela da unidade SI. Portanto, há uma incompatibilidade entre o prefixo literal e a representação interna.
** O símbolo da dimensão para a temperatura termodinâmica deve ser Θ (Theta) , mas a implementação atual não permite símbolos não-ASCII ou símbolos de múltiplas carros
| Unidade | Símbolo da dimensão | Expoente | Símbolo da unidade | índices implementados | unidade typedefs |
|---|---|---|---|---|---|
| Área | L | 2 | M2 | 10 -18 a 10 18 | square_*_metre_t |
| Volume | L | 3 | m3 | 10 -18 a 10 18 | cubic_*_metre_t |
| Freqüência | T | -1 | Hz | 10 -18 a 10 18 | *_hertz_t |
| Ângulo* | r | 1 | rad | 10 -18 a 1 | *_radian_t |
| Ângulo (graus)* | r | 1 | deg | Micro, Milli, 1 | *_radian_t |
| Ângulo sólido* | R | 1 | sr | 10 -18 a 1 | *_steradian_t |
* Ângulo, ângulo (grau) e ângulo sólido são recipientes simples, não contendo nenhuma funcionalidade para fazer computação de ângulo/ângulo sólido, como um estouro após 2* pi. A conversão entre radianos e grau pode perder precisão, especialmente se trabalhar com long doubles porque as proporções não são precisas o suficiente, pois precisam ser representadas como INTs longas
Todas as unidades que podem ser construídas a partir de outras unidades decaem para as respectivas unidades invertendo a operação matemática. Ou seja, se Q = I * T então Q / I = T e Q / T = I
| Unidade | Símbolo da dimensão | Símbolo da unidade | construível a partir de | Literais implementados | unidade typedefs |
|---|---|---|---|---|---|
| Velocidade | v | EM | L / t | m_p_s , km_p_h , _c | metre_per_second_t , kilometre_per_second_t , speed_of_light_t |
| Aceleração | um | m/s^2 | v / t, v^2 / l | nenhum | nenhum |
| Carga elétrica | Q | C | ISTO | AC para EC | *_coulomb_t |
| Potencial elétrico | U | V | P / i, e / q | av para Ev | *_volt_t |
| Resistência elétrica | O* | Ohm (Ω) | U / i, 1 / g | Aohm para eohm | *_ohm_t |
| Condutância elétrica | G | S | Eu / u, 1 / r | quanto a es | *_siemens_t |
| Capacidade elétrica | C | F | Q / U. | AF para ef | *_farad_t |
| Vigor | F | N | M * a | um para en | *_newton_t |
| Pressão | p | PA | F / l^2 | APA para EPA | *_pascal_t |
| Energia | E | J | F * l, p * l^3 | AJ para EJ | *_joule_t |
| Poder | P | C | E/t | aw para ew | *_watt_t |
| Fluxo magnético | f* | WB | U * t | awb para ewb | *_weber_t |
| Campo magnético | B | T | f/l^2 | AT TO ET | *_tesla_t |
| Momento | O* | kg⋅m/s | M * v | nenhum | nenhum |
| Indutância | l | H | f / i | ah a hein | *_henry_t |
| Fluxo luminoso | M* | LM | J * r | ALM para Elm | *_lumen_t |
| Luminância | eu* | LX | m / a | Alx para Elx | *_lux_t |
| Radioatividade | UM | BQ | ABQ para EBQ | *_becquerel_t | |
| Dose absorvida | D | Gy | Agy para Egy | *_gray_t | |
| Dose equivalente | H | Sv | ASV para ESV | *_sievert_t | |
| Atividade catalítica | K | Kat | N / t | Akat para Ekat | *_katal_t |
| Fluxo de superfície | s | m^2/s | L^2 / t | nenhum | |
| Fluxo volumétrico | V | m^3/s | L^3 / t | nenhum | |
| Frequência angular | c* | rad/s | r / t | nenhum |
* Essas dimensões ainda não têm os símbolos corretos, porque a implementação atual não permite símbolos não-ASCII ou símbolos de várias carch. O símbolo da dimensão para resistência elétrica deve ser Ω (Ohm) e para o fluxo magnético Φ (Phi) . A luminância deve ser E B. A velocidade angular deve ser ω (ômega). O fluxo luminoso deve ser φ V , que é ainda menos suportado que Φ (Phi) .
As unidades não padrão não são reguladas pelo BIPM, mas são aceitas para uso com o padrão SI.
| Unidade | Símbolo da dimensão | Literais | índices implementados | unidade typedefs |
|---|---|---|---|---|
| Unidades astronômicas de comprimento | L | Au, Ly, PC | 149597870691: 1 (AU), 9460730777119564: 1 (ly), 30856775814913700: 1 (PC) | astronomic_unit_t ( _AU ), lightyear_t ( _ly ), parsec_t ( _pc ) |
O SI é uma biblioteca somente para cabeçalho que usa recursos C ++ 17 . O edifício é testado usando CMake> 3,23 e verificado para G ++ 7, G ++ 8, Clang5, Clang6, Clang7, MSVC 19 e AppleClang 10.0. Eu recomendo usar o Conan 2.0 para baixar qualquer dependência para teste, mas pode ser usado sem ele, se os testes não forem criados.
O SI usa o gerador CMakePS de Conan para encontrar dependências. Para instalar o uso de dependências
conan install . --output-folder=build --build=missing --settings=build_type=Debug Substituto --settings=build_type=Debug com --settings=build_type=Release para alternar entre as compilações de depuração e liberação.
Usando o gerador CMakePS, você pode construir manualmente ou usar as predefinições CMake fornecidas.
cmake --preset=ci-ninja-debug
cmake --build build O local de instalação padrão para Si IS /usr/local/lib/SI . O SI pode ser instalado usando CMake bruto, CPACK (mecanismo de pacote CMakes) ou como um pacote Conan.io fornecido no Conan Center
Veja o Guia de Instalação para obter instruções detalhadas
Nota: Obter o SI como um pacote Conan é preferido.
Para instalar com o FetchContent do CMake, adicione o seguinte ao seu 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)O SI está disponível como download 'Raw' deste repositório, mas também como pacote Conan. Obter o SI de Conan-Center é a maneira preferida.
Para mais informações e detalhes técnicos mais profundos, consulte o documento de detalhes da implementação
As versões acima do 2.0.0 não serão totalmente compatíveis com versões mais antigas devido às mudanças de ruptura mencionadas no Changelog. A partir da versão 2.0.0, no pacote Conan é nomeado minúscula si para estar em conformidade com a Convenção de Nomeação de Conan.