CodeNebula
C++11stlintermediate

SI Prefixes (C++11 Addition)

C++11 · Modern Revolution · Compiler flag: -std=c++11

Explanation

Predefined `std::ratio` typedefs for SI metric prefixes: `atto`, `femto`, `pico`, `nano`, `micro`, `milli`, `centi`, `deci`, `deca`, `hecto`, `kilo`, `mega`, `giga`, `tera`, `peta`, and `exa`, enabling type-safe metric unit calculations.

Real-World Scenario

Define storage sizes or network bandwidth units using SI prefixes for a system monitoring tool.

Quick Snippet

snippet.cpp
#include <ratio>
static_assert(std::kilo::num == 1000, "kilo = 1000");
static_assert(std::mega::num == 1000000, "mega = 10^6");
static_assert(std::milli::num == 1 && std::milli::den == 1000, "milli = 1/1000");
static_assert(std::nano::num == 1 && std::nano::den == 1000000000, "nano = 10^-9");

Full Example

si_prefixes.cpp
// CodeNebula - C++11 Example: SI Prefixes
// Compile: g++ -std=c++11 -Wall -Wextra -o example si_prefixes.cpp

// Demonstrates the predefined std::ratio SI prefix typedefs:
// atto (10^-18) through exa (10^18).

#include <iostream>
#include <ratio>
#include <iomanip>

// Helper to print a ratio's num/den
template <typename R>
void print_ratio(const char* name) {
    std::cout << std::setw(6) << name << ": "
              << R::num << " / " << R::den << "\n";
}

int main() {
    std::cout << "=== SI prefixes (small) ===\n";
    print_ratio<std::atto> ("atto");    // 10^-18
    print_ratio<std::femto>("femto");   // 10^-15
    print_ratio<std::pico> ("pico");    // 10^-12
    print_ratio<std::nano> ("nano");    // 10^-9
    print_ratio<std::micro>("micro");   // 10^-6
    print_ratio<std::milli>("milli");   // 10^-3
    print_ratio<std::centi>("centi");   // 10^-2
    print_ratio<std::deci> ("deci");    // 10^-1

    std::cout << "\n=== SI prefixes (large) ===\n";
    print_ratio<std::deca> ("deca");    // 10^1
    print_ratio<std::hecto>("hecto");   // 10^2
    print_ratio<std::kilo> ("kilo");    // 10^3
    print_ratio<std::mega> ("mega");    // 10^6
    print_ratio<std::giga> ("giga");    // 10^9
    print_ratio<std::tera> ("tera");    // 10^12
    print_ratio<std::peta> ("peta");    // 10^15
    print_ratio<std::exa>  ("exa");     // 10^18

    // Practical: convert 5 kilometers to meters using kilo
    double km = 5.0;
    double m = km * std::kilo::num / std::kilo::den;
    std::cout << "\n5 km = " << m << " m\n";

    // Convert 250 millivolts to volts using milli
    double mv = 250.0;
    double v = mv * static_cast<double>(std::milli::num) / std::milli::den;
    std::cout << "250 mV = " << v << " V\n";

    // Convert 3.2 gigahertz to hertz
    double ghz = 3.2;
    double hz = ghz * std::giga::num / std::giga::den;
    std::cout << std::fixed << std::setprecision(0);
    std::cout << "3.2 GHz = " << hz << " Hz\n";

    return 0;
}

// Expected output:
//  === SI prefixes (small) ===
//   atto: 1 / 1000000000000000000
//  femto: 1 / 1000000000000000
//   pico: 1 / 1000000000000
//   nano: 1 / 1000000000
//  micro: 1 / 1000000
//  milli: 1 / 1000
//  centi: 1 / 100
//   deci: 1 / 10
//
// === SI prefixes (large) ===
//   deca: 10 / 1
//  hecto: 100 / 1
//   kilo: 1000 / 1
//   mega: 1000000 / 1
//   giga: 1000000000 / 1
//   tera: 1000000000000 / 1
//   peta: 1000000000000000 / 1
//    exa: 1000000000000000000 / 1
//
// 5 km = 5000 m
// 250 mV = 0.25 V
// 3.2 GHz = 3200000000 Hz
Run command
g++ -std=c++11 -Wall -Wextra -o example si_prefixes.cpp