- 



Una biblioteca de encabezado solo C ++ que proporciona seguridad de seguridad y literales definidos por el usuario para manejar valores físicos definidos en el sistema internacional de unidades reguladas por la Oficina Internacional de Pesos y Medidas (BIPM) y publicado en el folleto SI. Para un inicio rápido, consulte la guía de instalación. Las contribuciones y los comentarios son bienvenidos, consulte las pautas de contribución para obtener más información.
Un ejemplo 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 ;
} SI proporciona conversiones y operaciones aritméticas con valores de cualquiera de los sistemas internacionales de unidades con una fuerte seguridad de tipo en el tiempo de compilación . Todas las unidades son typedefs especiales de la plantilla struct SI::unit_t . Solo el valor de la unidad se almacena internamente, la relación (es decir, mili, micro, kilo ...) se determina como un rasgo de tipo para permitir que todas las unidades tengan la misma resolución en todas las relaciones implementadas. SI maneja las operaciones de unidades de las mismas relaciones, así como cuando las proporciones son diferentes. Consulte los detalles de implementación de documentación para obtener más información. Las operaciones entre unidades de la misma relación no tienen gastos generales, de lo contrario, hay un costo de cálculo adicional para ajustar los valores a las unidades. Pasando la bandera SI_DISABLE_IMPLICIT_RATIO_CONVERSION a la conversión de relación implícita del compilador no se realiza y falla con un error del compilador. Consulte los resultados de referencia continuos para una comparación entre las mediciones de referencia y la implementación en SI.
Es posible suministrar relaciones personalizadas a los tipos incorporados y son totalmente compatibles para el cálculo con otras unidades. Sin embargo, los literales o typedefs necesarios deben ser suministrados por el usuario. Por ejemplo SI::velocity_t<double, std::ratio<1000, 36>> sería "kilómetro por centésima parte de una hora".
La conversión entre unidades se realiza con la función de miembro as<unit_t>() de unit_ o la función libre SI::unit_cast<unit_t>(unit_t u) . Esto convertirá un valor del mismo tipo pero una relación diferente.
Para cada unidad, los literales disponibles son las proporciones implementadas prefijadas con un bajo. es decir, _mm . _km . En general, las proporciones siguen los prefijos métricos del sistema internacional de unidades, los typedefs tienen prefijo (o en casos raros interactuados) con los prefijos métricos estándar. es decir metre_t, milli_metre_t, kilo_metre_t . El prefijo o la interpción está marcado con un * en las tablas a continuación. Las unidades que han definido typedefs y literales se pueden convertir en cadenas utilizando operadores de flujo o la función SI::to_string . Para usar los operadores de transmisión, incluya el archivo de encabezado SI/stream.h
| Unidad | Símbolo de dimensión | Símbolo de la unidad | relaciones implementadas | Typeedefs de la unidad |
|---|---|---|---|---|
| Longitud | L | metro | 10-18 a 10 18 | *_metre_t |
| Tiempo | T | s | 10-18 a 10 0 y 60/1, 3600/1 | *_seconds_t, minutes_t, hours_t |
| Masa* | METRO | kg | 10-15 a 10 18 | *_gram_t , *_ton_t |
| Corriente eléctrica | I | A | 10-18 a 10 18 | *_ampere_t |
| Temperatura termodinámica ** | T | K | 10-18 a 10 18 | *_kelvin_t |
| Cantidad de sustancia | norte | moles | 10-18 a 10 18 | *_mol_t |
| Luminosidad | J | cd | 10-18 a 10 18 | *_candela_t |
* Para la masa, la relación base es kg (no g ) como se define en la tabla de la unidad SI. Entonces hay un desajuste entre el prefijo literal y la representación interna.
** El símbolo de la dimensión para la temperatura termodinámica debe ser Θ (Theta) , pero la implementación actual no permite símbolos no ASCII o símbolos multi-Char
| Unidad | Símbolo de dimensión | Exponente | Símbolo de la unidad | relaciones implementadas | Typeedefs de la unidad |
|---|---|---|---|---|---|
| Área | L | 2 | m2 | 10-18 a 10 18 | square_*_metre_t |
| Volumen | L | 3 | m3 | 10-18 a 10 18 | cubic_*_metre_t |
| Frecuencia | T | -1 | Hz | 10-18 a 10 18 | *_hertz_t |
| Ángulo* | riñonal | 1 | radiante | 10-18 a 1 | *_radian_t |
| Ángulo (grados)* | riñonal | 1 | teg | micro, mili, 1 | *_radian_t |
| Ángulo sólido* | Riñonal | 1 | sr | 10-18 a 1 | *_steradian_t |
* El ángulo, el ángulo (grado) y el ángulo sólido son contenedores simples, que no contienen ninguna funcionalidad para hacer un cálculo de ángulo/ángulo sólido, como un desbordamiento después de 2* Pi. La conversión entre radianes y grado podría perder precisión, especialmente si trabaja con long doubles porque las proporciones no lo suficientemente precisas, ya que tienen que representarse tan largos ints
Todas las unidades que se pueden construir desde otras unidades decaen a las unidades respectivas invirtiendo la operación matemática. Es decir, si Q = I * T entonces Q / I = T y Q / T = I
| Unidad | Símbolo de dimensión | Símbolo de la unidad | construible desde | literales implementados | Typeedefs de la unidad |
|---|---|---|---|---|---|
| Velocidad | V | EM | L / T | m_p_s , km_p_h , _c | metre_per_second_t , kilometre_per_second_t , speed_of_light_t |
| Aceleración | a | M/S^2 | V / T, V^2 / L | ninguno | ninguno |
| Carga eléctrica | Q | do | ÉL | AC a EC | *_coulomb_t |
| Potencial eléctrico | U | V | P / I, E / Q | Av a EV | *_volt_t |
| Resistencia eléctrica | O* | Ohm (Ω) | U / i, 1 / g | aohm a eohm | *_ohm_t |
| Conductancia eléctrica | GRAMO | S | I / u, 1 / r | En cuanto a es | *_siemens_t |
| Capacidad eléctrica | do | F | Q / U | AF a EF | *_farad_t |
| Fuerza | F | norte | M * a | un a en | *_newton_t |
| Presión | pag | Pensilvania | F / l^2 | APA a la EPA | *_pascal_t |
| Energía | mi | J | F * l, p * l^3 | AJ a EJ | *_joule_t |
| Fuerza | PAG | W | E/t | aw a ew | *_watt_t |
| Flujo magnético | F* | WB | U * t | AWB a EWB | *_weber_t |
| Campo magnético | B | T | f/l^2 | a a et | *_tesla_t |
| Impulso | o* | kg past/s | M * V | ninguno | ninguno |
| Inductancia | l | H | f / | ah a eh | *_henry_t |
| Flujo luminoso | metro* | lm | J * r | Alm a Elm | *_lumen_t |
| Luminancia | i* | lx | m / a | Alx a Elx | *_lux_t |
| Radioactividad | A | Bq | ABQ a EBQ | *_becquerel_t | |
| Dosis absorbida | D | Gy | Agy a Egy | *_gray_t | |
| Dosis equivalente | H | SV | ASV a ESV | *_sievert_t | |
| Actividad catalítica | K | kat | N / T | akat a ekat | *_katal_t |
| Flujo superficial | s | m^2/s | L^2 / t | ninguno | |
| Flujo volumétrico | V | m^3/s | L^3 / t | ninguno | |
| Frecuencia angular | W* | Rad/S | r / t | ninguno |
* Estas dimensiones aún no tienen los símbolos correctos, porque la implementación actual no permite símbolos no ASCII o símbolos multi-Char. El símbolo de la dimensión para la resistencia eléctrica debe ser Ω (Ohm) y para el flujo magnético Φ (Phi) . La luminancia debe ser e b . La velocidad angular debe ser ω (omega). El flujo luminoso debe ser φ V, que es aún menos soportado que Φ (Phi) mismo.
Las unidades no estándar no están reguladas por el BIPM, sino que se aceptan para su uso con el estándar SI.
| Unidad | Símbolo de dimensión | literales | relaciones implementadas | Typeedefs de la unidad |
|---|---|---|---|---|
| Unidades astronómicas de longitud | L | Au, ly, PC | 149597870691: 1 (AU), 9460730777119564: 1 (LY), 30856775814913700: 1 (PC) | astronomic_unit_t ( _AU ), lightyear_t ( _ly ), parsec_t ( _pc ) |
SI es una biblioteca solo de encabezado que usa características de C ++ 17 . El edificio se prueba usando CMake> 3.23 y se verifica para G ++ 7, G ++ 8, Clang5, Clang6, Clang7, MSVC 19 y Appleclang 10.0. Recomiendo usar Conan 2.0 para descargar cualquier dependencia para las pruebas, pero se puede usar sin ella, si las pruebas no están construidas.
SI utiliza el generador CMakedeps de Conan para encontrar dependencias. Para instalar el uso de dependencias
conan install . --output-folder=build --build=missing --settings=build_type=Debug Sustituye --settings=build_type=Debug con --settings=build_type=Release para cambiar entre depurar y liberar compilaciones.
Al usar el generador CMakedEps, puede construir manualmente o usar los preajustes Cmake proporcionados.
cmake --preset=ci-ninja-debug
cmake --build build La ubicación de instalación predeterminada para SI es /usr/local/lib/SI . SI se puede instalar utilizando CMAKE RAW, CPACK (mecanismo de paquete CMakes) o como un paquete Conan.io proporcionado desde Conan Center
Consulte la guía de instalación para obtener instrucciones detalladas
Nota: Se prefiere obtener SI como paquete de Conan.
Para instalar con FetchContent de Cmake, agregue lo siguiente a su 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 está disponible como descarga 'Raw' de este repositorio pero también como paquete de Conan. Obtener Si de Conan-Center es la forma preferida.
Para obtener más información y detalles técnicos más profundos, consulte el documento de detalles de implementación
Las versiones superiores a 2.0.0 no serán totalmente compatibles con versiones más antiguas debido a los cambios de ruptura mencionados en el cambio de cambio. De la versión 2.0.0 en el paquete de Conan se llama minúscula si para ajustarse a la Convención de Naming de Conan.