- 



Header hanya perpustakaan C ++ yang menyediakan jenis keselamatan dan literal yang ditentukan pengguna untuk menangani nilai -nilai fisik yang ditentukan dalam sistem unit internasional yang diatur oleh Biro Bobot dan Langkah -langkah Internasional (BIPM) dan diterbitkan dalam brosur SI. Untuk mulai cepat, lihat panduan instalasi. Kontribusi dan komentar dipersilakan, silakan periksa pedoman kontribusi untuk informasi lebih lanjut.
Contoh ilustratif:
# 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 menyediakan konversi dan operasi aritmatika dengan nilai -nilai sistem unit internasional mana pun dengan keamanan tipe yang kuat pada waktu kompilasi . Semua unit adalah typedef khusus dari template struct SI::unit_t . Hanya nilai unit yang disimpan secara internal, rasio (yaitu mili, mikro, kilo ...) ditentukan sebagai sifat tipe untuk memungkinkan semua unit memiliki resolusi yang sama di seluruh rasio yang diimplementasikan. SI menangani operasi unit rasio yang sama serta ketika rasio berbeda. Lihat detail implementasi dokumentasi untuk informasi lebih lanjut. Operasi antara unit rasio yang sama bebas overhead, kalau tidak ada biaya perhitungan tambahan untuk menyesuaikan nilai dengan unit. Melewati bendera SI_DISABLE_IMPLICIT_RATIO_CONVERSION ke konversi rasio implisit kompiler tidak dilakukan dan gagal dengan kesalahan kompiler. Lihat hasil benchmark kontinu untuk perbandingan antara pengukuran referensi dan implementasi di SI.
Dimungkinkan untuk memasok rasio khusus ke jenis bawaan dan mereka sepenuhnya kompatibel untuk perhitungan dengan unit lain. Namun, literal atau typedef yang diperlukan harus dipasok oleh pengguna. Misalnya SI::velocity_t<double, std::ratio<1000, 36>> akan menjadi "kilometer per seperserang ratus satu jam".
Konversi antar unit dilakukan dengan Fungsi Anggota as<unit_t>() atau fungsi SI::unit_cast<unit_t>(unit_t u) unit_ Ini akan mengonversi nilai dari tipe yang sama tetapi rasio yang berbeda.
Untuk setiap unit literal yang tersedia adalah rasio yang diimplementasikan diawali dengan garis bawah. yaitu _mm . _km . Umumnya rasio mengikuti awalan metrik dari sistem unit internasional yang diketik oleh ketik (atau dalam kasus yang jarang dihubungkan) dengan awalan metrik standar. IE metre_t, milli_metre_t, kilo_metre_t . Awalan atau antarmuka ditandai dengan * di tabel di bawah ini. Unit yang telah menentukan typedef dan literal dapat dikonversi menjadi string menggunakan operator aliran atau fungsi SI::to_string . Untuk menggunakan operator stream, sertakan file header SI/stream.h
| Satuan | Simbol dimensi | Simbol unit | rasio yang diimplementasikan | unit typedefs |
|---|---|---|---|---|
| Panjang | L | M | 10 -18 hingga 10 18 | *_metre_t |
| Waktu | T | S | 10 -18 hingga 10 0 dan 60/1, 3600/1 | *_seconds_t, minutes_t, hours_t |
| Massa* | M | kg | 10 -15 hingga 10 18 | *_gram_t , *_ton_t |
| Arus listrik | SAYA | A | 10 -18 hingga 10 18 | *_ampere_t |
| Suhu termodinamika ** | T | K | 10 -18 hingga 10 18 | *_kelvin_t |
| Jumlah substansi | N | mol | 10 -18 hingga 10 18 | *_mol_t |
| Kilau | J | CD | 10 -18 hingga 10 18 | *_candela_t |
* Untuk massa rasio basa adalah kg (bukan g ) sebagaimana didefinisikan dalam tabel unit SI. Jadi ada ketidaksesuaian antara awalan literal dan representasi internal.
** Simbol dimensi untuk suhu termodinamika harus Θ (Theta) , tetapi implementasi saat ini tidak memungkinkan simbol non-ASCII atau simbol multi-char
| Satuan | Simbol dimensi | Eksponen | Simbol unit | rasio yang diimplementasikan | unit typedefs |
|---|---|---|---|---|---|
| Daerah | L | 2 | M2 | 10 -18 hingga 10 18 | square_*_metre_t |
| Volume | L | 3 | M3 | 10 -18 hingga 10 18 | cubic_*_metre_t |
| Frekuensi | T | -1 | Hz | 10 -18 hingga 10 18 | *_hertz_t |
| Sudut* | R | 1 | rad | 10 -18 hingga 1 | *_radian_t |
| Sudut (derajat)* | R | 1 | deg | Mikro, Milli, 1 | *_radian_t |
| Sudut padat* | R | 1 | sr | 10 -18 hingga 1 | *_steradian_t |
* Sudut, sudut (derajat) dan sudut padat adalah wadah sederhana, tidak mengandung fungsionalitas apa pun untuk melakukan komputasi sudut/sudut padat seperti overflow setelah 2* pi. Konversi antara radian dan derajat mungkin kehilangan presisi, terutama jika bekerja dengan long doubles karena rasio tidak cukup tepat, karena mereka harus diwakili sebagai ints panjang
Semua unit yang dapat dibangun dari unit lain membusuk ke unit masing -masing dengan membalikkan operasi matematika. Yaitu jika Q = I * T kemudian Q / I = T dan Q / T = I
| Satuan | Simbol dimensi | Simbol unit | dapat dibangun dari | Literal yang diimplementasikan | unit typedefs |
|---|---|---|---|---|---|
| Kecepatan | v | MS | L / t | m_p_s , km_p_h , _c | metre_per_second_t , kilometre_per_second_t , speed_of_light_t |
| Percepatan | A | m/s^2 | v / t, v^2 / l | tidak ada | tidak ada |
| Muatan listrik | Q | C | DIA | AC ke EC | *_coulomb_t |
| Potensi listrik | U | V | P / i, e / q | AV ke EV | *_volt_t |
| Resistensi listrik | HAI* | Ohm (Ω) | U / i, 1 / g | AOHM TO EOHM | *_ohm_t |
| Konduktansi listrik | G | S | I / u, 1 / r | untuk es | *_siemens_t |
| Kapasitas listrik | C | F | Q / u | AF ke EF | *_farad_t |
| Memaksa | F | N | M * a | an to en | *_newton_t |
| Tekanan | P | pa | F / l^2 | APA ke EPA | *_pascal_t |
| Energi | E | J | F * l, p * l^3 | AJ ke EJ | *_joule_t |
| Kekuatan | P | W | E/t | AW untuk EW | *_watt_t |
| Fluks magnet | F* | WB | U * t | AWB ke EWB | *_weber_t |
| Medan magnet | B | T | f/l^2 | di ET | *_tesla_t |
| Momentum | Hai* | kg⋅m/s | M * v | tidak ada | tidak ada |
| Induktansi | l | H | f / i | Ah untuk eh | *_henry_t |
| Fluks bercahaya | M* | LM | J * r | Alm ke Elm | *_lumen_t |
| Luminance | Saya* | lx | m / a | Alx ke Elx | *_lux_t |
| Radioaktivitas | A | Bq | ABQ ke EBQ | *_becquerel_t | |
| Dosis yang diserap | D | Gy | agy ke egy | *_gray_t | |
| Dosis yang setara | H | Sv | ASV ke ESV | *_sievert_t | |
| Aktivitas katalitik | K | Kat | N / t | akat ke Ekat | *_katal_t |
| Aliran permukaan | S | m^2/s | L^2 / t | tidak ada | |
| Aliran volumetrik | V | m^3/s | L^3 / t | tidak ada | |
| Frekuensi sudut | W* | rad/s | r / t | tidak ada |
* Dimensi ini belum memiliki simbol yang benar, karena implementasi saat ini tidak memungkinkan simbol non-ASCII atau simbol multi-char. Simbol dimensi untuk resistansi listrik harus Ω (Ohm) dan untuk fluks magnetik Φ (Phi) . Luminance harus e b . Kecepatan sudut harus Ω (omega). Fluks bercahaya harus φ V yang bahkan kurang didukung daripada Φ (Phi) itu sendiri.
Unit non standar tidak diatur oleh BIPM tetapi diterima untuk digunakan dengan standar SI.
| Satuan | Simbol dimensi | literal | rasio yang diimplementasikan | unit typedefs |
|---|---|---|---|---|
| Unit Panjang Astronomi | L | Au, ly, pc | 149597870691: 1 (AU), 9460730777119564: 1 (LY), 30856775814913700: 1 (PC) | astronomic_unit_t ( _AU ), lightyear_t ( _ly ), parsec_t ( _pc ) |
SI adalah pustaka header saja yang menggunakan fitur C ++ 17 . Bangunan diuji menggunakan CMake> 3.23 dan diverifikasi untuk G ++ 7, G ++ 8, Clang5, Clang6, Clang7, MSVC 19, dan Appleclang 10.0. Saya sarankan menggunakan Conan 2.0 untuk mengunduh dependensi untuk pengujian, tetapi dapat digunakan tanpa itu, jika tes tidak dibangun.
SI menggunakan generator Cmakedeps Conan untuk menemukan dependensi. Untuk menginstal penggunaan dependensi
conan install . --output-folder=build --build=missing --settings=build_type=Debug Pengganti --settings=build_type=Debug dengan --settings=build_type=Release untuk beralih antara debug dan rilis build.
Dengan menggunakan generator cmakedeps, Anda dapat membangun secara manual atau menggunakan preset CMake yang disediakan.
cmake --preset=ci-ninja-debug
cmake --build build Lokasi instalasi default untuk SI IS /usr/local/lib/SI . SI dapat diinstal menggunakan cmake mentah, cpack (mekanisme paket cmakes), atau sebagai paket conan.io yang disediakan dari conan center
Lihat panduan instalasi untuk instruksi terperinci
Catatan: Mendapatkan SI sebagai paket Conan lebih disukai.
Untuk menginstal dengan cmake's fetchcontent, tambahkan yang berikut ini ke cmakelists.txt Anda
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 tersedia sebagai unduhan 'mentah' dari repositori ini tetapi juga sebagai paket Conan. Mendapatkan SI dari Conan-Center adalah cara yang disukai.
Untuk informasi lebih lanjut dan detail teknis yang lebih dalam, lihat dokumen Detail Implementasi
Versi di atas 2.0.0 tidak akan sepenuhnya kompatibel dengan versi yang lebih lama karena perubahan yang disebutkan dalam changelog. Dari versi 2.0.0 pada paket Conan bernama Lower Case si untuk menyesuaikan diri dengan konvensi penamaan Conan.