- - 



Ein Header nur eine C ++ - Bibliothek, die Typensicherheit und benutzerdefinierte Literale für die Behandlung physikalischer Werte bietet, die im internationalen System von Einheiten definiert werden, die vom Internationalen Büro für Gewichte und Messungen (BIPM) reguliert und in der SI -Broschüre veröffentlicht wurden. Für einen kurzen Start finden Sie die Installationshandbuch. Beiträge und Kommentare sind willkommen. Weitere Informationen finden Sie in den Beitragsrichtlinien.
Ein illustratives Beispiel:
# 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 liefert Conversions und arithmetische Operationen Werte eines der internationalen Systeme von Einheiten mit starker Art von Sicherheit zum Kompilierungszeit . Alle Einheiten sind spezielle Typedefs der Vorlagestruktur SI::unit_t . Nur der Wert der Einheit wird intern gespeichert, wird das Verhältnis (dh Milli, Micro, Kilo ...) als Typmerkmal bestimmt, damit alle Einheiten die gleiche Auflösung über die gesamten implementierten Verhältnisse hinweg aufweisen können. SI übernimmt die Operationen von Einheiten derselben Verhältnisse sowie wenn die Verhältnisse unterschiedlich sind. Weitere Informationen finden Sie in den Details zur Implementierung der Dokumentation. Die Operationen zwischen Einheiten desselben Verhältnisses sind über Kopffreie, sonst haben zusätzliche Rechenkosten, um die Werte an die Einheiten anzupassen. Das Flag SI_DISABLE_IMPLICIT_RATIO_CONVERSION an den Implikator -Verhältnisumwandlungsumsatz von Compiler ist nicht durchgeführt und fällt mit einem Compiler -Fehler fehl. Siehe die kontinuierlichen Benchmark -Ergebnisse für einen Vergleich zwischen den Referenzmessungen und der Implementierung in SI.
Es ist möglich, kundenspezifische Verhältnisse an die integrierten Typen zu liefern, und sie sind für die Berechnung mit anderen Einheiten vollständig kompatibel. Die erforderlichen Literale oder Typedefs müssen jedoch vom Benutzer geliefert werden. Zum Beispiel SI::velocity_t<double, std::ratio<1000, 36>> wäre "Kilometer pro Hundertstündel".
Das Konvertieren zwischen Einheiten erfolgt entweder mit der Funktion von as<unit_t>() von unit_ oder der freien Funktion SI::unit_cast<unit_t>(unit_t u) . Dadurch wird ein Wert desselben Typs, aber ein anderes Verhältnis umgewandelt.
Für jede Einheit sind die verfügbaren Literale die implementierten Verhältnisse, die mit einem Unterstrich vorangestellt sind. dh _mm . _km . Im Allgemeinen folgen die Verhältnisse metrische Präfixe des internationalen Einheitensystems, in dem die Typedefs mit den Standardpräfixen vorangestellt (oder in seltenen Fällen interfixiert) werden. dh metre_t, milli_metre_t, kilo_metre_t . Das Präfix oder das Interfix ist in den folgenden Tabellen mit einem * gekennzeichnet. Einheiten, die Typedefs und Literale definiert haben, können mit Stream -Operatoren oder der SI::to_string -Funktion in Zeichenfolgen konvertiert werden. Um die Stream -Operatoren zu verwenden, geben Sie die Header -Datei SI/stream.h ein
| Einheit | Dimensionsymbol | Einheitssymbol | implementierte Verhältnisse | Einheit Typedefs |
|---|---|---|---|---|
| Länge | L | M | 10 -18 bis 10 18 | *_metre_t |
| Zeit | T | S | 10 -18 bis 10 0 und 60/1, 3600/1 | *_seconds_t, minutes_t, hours_t |
| Masse* | M | kg | 10 -15 bis 10 18 | *_gram_t , *_ton_t |
| Elektrischer Strom | ICH | A | 10 -18 bis 10 18 | *_ampere_t |
| Thermodynamische Temperatur ** | T | K | 10 -18 bis 10 18 | *_kelvin_t |
| Substanzmenge | N | Mol | 10 -18 bis 10 18 | *_mol_t |
| Helligkeit | J | CD | 10 -18 bis 10 18 | *_candela_t |
* Für die Masse beträgt das Basisverhältnis kg (nicht g ) wie in der Si -Einheitstabelle definiert. Es gibt also eine Missverhältnis zwischen dem wörtlichen Präfix und der internen Darstellung.
** Das Dimensionsymbol für die thermodynamische Temperatur sollte Θ (Theta) sein
| Einheit | Dimensionsymbol | Exponent | Einheitssymbol | implementierte Verhältnisse | Einheit Typedefs |
|---|---|---|---|---|---|
| Bereich | L | 2 | M2 | 10 -18 bis 10 18 | square_*_metre_t |
| Volumen | L | 3 | M3 | 10 -18 bis 10 18 | cubic_*_metre_t |
| Frequenz | T | -1 | Hz | 10 -18 bis 10 18 | *_hertz_t |
| Winkel* | R | 1 | rad | 10 -18 bis 1 | *_radian_t |
| Winkel (Grad)* | R | 1 | Grad | Micro, Milli, 1 | *_radian_t |
| Fester Winkel* | R | 1 | sr | 10 -18 bis 1 | *_steradian_t |
* Winkel, Winkel (Grad) und fester Winkel sind einfache Behälter, die keine Funktionalität für die Winkel-/Festwinkelberechnung wie einen Überlauf nach 2* pi enthalten. Die Konvertierung zwischen Radians und Grad kann Präzision verlieren, insbesondere wenn sie mit long doubles arbeiten, da die Verhältnisse nicht präzise genug sind, da sie als lange INTs dargestellt werden müssen
Alle Einheiten, die aus anderen Einheiten gebaut werden können, zerfallen auf die jeweiligen Einheiten, indem die mathematische Operation invertiert werden. Dh wenn Q = I * T dann Q / I = T und Q / T = I
| Einheit | Dimensionsymbol | Einheitssymbol | baubar aus | implementierte Literale | Einheit Typedefs |
|---|---|---|---|---|---|
| Geschwindigkeit | v | MS | L / t | m_p_s , km_p_h , _c | metre_per_second_t , kilometre_per_second_t , speed_of_light_t |
| Beschleunigung | A | m/s^2 | v / t, v^2 / l | keiner | keiner |
| Elektrische Ladung | Q | C | ES | AC zu EC | *_coulomb_t |
| Elektrisches Potential | U | V | P / i, e / q | av zu ev | *_volt_t |
| Elektrischer Widerstand | O* | Ohm (ω) | U / i, 1 / g | AOhm nach Eohm | *_ohm_t |
| Elektrische Leitfähigkeit | G | S | I / u, 1 / r | in Bezug auf es | *_siemens_t |
| Elektrische Kapazität | C | F | Q / U | af zu ef | *_farad_t |
| Gewalt | F | N | M * a | An zu en | *_newton_t |
| Druck | P | pa | F / l^2 | APA zu EPA | *_pascal_t |
| Energie | E | J | F * l, p * l^3 | AJ zu EJ | *_joule_t |
| Leistung | P | W | E/t | aw zu ew | *_watt_t |
| Magnetischer Fluss | F* | Wb | U * t | AWB zu EWB | *_weber_t |
| Magnetfeld | B | T | f/l^2 | bei ET | *_tesla_t |
| Schwung | O* | kg · m/s | M * v | keiner | keiner |
| Induktivität | l | H | f / i | Ah zu eh | *_henry_t |
| Leuchtender Fluss | M* | lm | J * r | Alm zu Elm | *_lumen_t |
| Luminanz | ich* | lx | m / a | Alx zu Elx | *_lux_t |
| Radioaktivität | A | Bq | ABQ zu EBQ | *_becquerel_t | |
| Absorbierte Dosis | D | Gy | Agy nach Ägyp | *_gray_t | |
| Äquivalente Dosis | H | SV | ASV zu ESV | *_sievert_t | |
| Katalytische Aktivität | K | Kat | N / t | Akat zu Ekat | *_katal_t |
| Oberflächenfluss | S | m^2/s | L^2 / t | keiner | |
| Volumetrischer Fluss | V | m^3/s | L^3 / t | keiner | |
| Winkelfrequenz | w* | rad/s | r / t | keiner |
* Diese Dimensionen haben noch nicht die richtigen Symbole, da die aktuelle Implementierung keine nicht-ascii-Symbole oder Multi-Char-Symbole zulässt. Das Dimensionsymbol für den elektrischen Widerstand sollte Ω (Ohm) und für den magnetischen Fluss Φ (Phi) sein. Luminanz sollte e b sein. Winkelgeschwindigkeit sollte ω (Omega) sein. Der leuchtende Fluss sollte φ V sein, der noch weniger unterstützt wird als Φ (Phi) selbst.
Nicht -Standardeinheiten werden nicht vom BIPM reguliert, sondern für die Verwendung mit dem SI -Standard akzeptiert.
| Einheit | Dimensionsymbol | Literale | implementierte Verhältnisse | Einheit Typedefs |
|---|---|---|---|---|
| Astronomische Längeneinheiten | L | Au, Ly, PC | 149597870691: 1 (AU), 9460730777119564: 1 (LY), 30856775814913700: 1 (PC) | astronomic_unit_t ( _AU ), lightyear_t ( _ly ), parsec_t ( _pc ) |
SI ist eine Nur-Header-Bibliothek, die C ++ 17- Funktionen verwendet. Das Gebäude wird unter Verwendung von CMake> 3.23 getestet und für G ++ 7, G ++ 8, CLANG5, CLANG6, CLANG7, MSVC 19 und APPLECILLG 10.0 verifiziert. Ich empfehle , Conan 2.0 zu verwenden, um Abhängigkeiten zum Testen herunterzuladen, kann jedoch ohne sie verwendet werden, wenn die Tests nicht erstellt werden.
SI verwendet CMAKEDEPS -Generator von Conan, um Abhängigkeiten zu finden. Um die Verwendungsabhängigkeiten zu installieren
conan install . --output-folder=build --build=missing --settings=build_type=Debug Ersatz --settings=build_type=Debug mit --settings=build_type=Release um zwischen Debug- und Release -Builds zu wechseln.
Durch die Verwendung des Cmakedeps -Generators können Sie entweder manuell erstellen oder die bereitgestellten CMAKE -Voreinstellungen verwenden.
cmake --preset=ci-ninja-debug
cmake --build build Der Standard -Installationsort für SI ist /usr/local/lib/SI . SI kann mit RAW CMAKE, CPACK (CMAKES -Paketmechanismus) oder als Conan.io -Paket vom Conan Center installiert werden
Ausführliche Anweisungen finden Sie im Installationshandbuch
Hinweis: Es wird bevorzugt, SI als Conan -Paket zu bekommen.
Um mit dem FetchContent von CMake zu installieren, fügen Sie Folgendes zu Ihren cmakelists.txt hinzu
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 ist als "RAW" -Download von diesem Repository erhältlich, aber auch als Conan -Paket. SI von Conan-Center zu holen, ist die bevorzugte Art und Weise.
Weitere Informationen und technische technische Details finden Sie im Implementierungsdetails Dokument
Versionen über 2.0.0 sind aufgrund der im Changelog genannten Veränderungen nicht vollständig kompatibel mit älteren Versionen. Ab Version 2.0.0 im Conan -Paket heißt es unter dem Unterfall si , der sich der Conan -Namenskonvention entspricht.