3.8 KiB
Simple Math
Learn to perform calculations with quantities. The library handles units automatically!
Goal: Add, subtract, multiply, and divide quantities
Time: ~10 minutes
Math with Quantities
One of mp-units' superpowers: units are handled automatically during calculations.
When you divide distance by time, you get speed (km/h) - no manual conversions needed!
Try It: Basic Operations
// ce-embed height=600 compiler=clang2110 flags="-std=c++23 -stdlib=libc++ -O3" mp-units=trunk
#include <mp-units/systems/si.h>
#include <format>
#include <iostream>
int main()
{
using namespace mp_units;
using namespace mp_units::si::unit_symbols;
// Journey distances
quantity trip1 = 6 * km;
quantity trip2 = 2700 * m;
// Addition: km + m = m (common unit!)
quantity total_distance = trip1 + trip2;
std::cout << std::format("Total distance: {}\n", total_distance);
// Time taken
quantity time = 2 * h;
// Division: km / h = km/h (speed!)
quantity average_speed = total_distance / time;
std::cout << std::format("Average speed: {}\n", average_speed);
// Multiplication: speed * time = distance
quantity distance_traveled = average_speed * time;
std::cout << std::format("Distance traveled: {}\n", distance_traveled);
// Subtraction: km - m = m (common unit!)
quantity difference = trip1 - trip2;
std::cout << std::format("Difference between trips: {}\n", difference);
}
What happened:
- Addition/Subtraction: Only works with compatible units (km + m ✅, km + hours ❌)
- Notice: Adding
km + mautomatically converted to a common unit (m)
- Notice: Adding
- Multiplication/Division: Creates new units automatically (km ÷ h = km/h)
- Dimensional analysis: The library tracks units through all operations
Key insight: The library automatically handles unit conversions and dimensional analysis during calculations.
Valid Operations
| Operation | Example | Result Unit |
|---|---|---|
| Addition | 120 * km + 80 * km |
200 km |
| Subtraction | 120 * km - 80 * km |
40 km |
| Division | 120 * km / (2 * h) |
60 km/h |
| Multiplication | 60 * km / h * (2 * h) |
120 km |
| Scalar multiply | 50 * km * 2 |
100 km |
| Scalar divide | 100 * km / 4 |
25 km |
Common Units in Addition/Subtraction
When adding quantities with different units (like km + m above), the library picks a common unit for the result - typically the more fundamental unit:
quantity result = 1 * km + 2000 * m; // Result: 3000 m
!!! info
When mixing different unit systems (e.g., SI km + imperial mi), the library finds a
common unit that may differ from both inputs. You'll often need to explicitly convert
to your preferred unit with `.in(unit)`. Learn more about this in
[Generic Interfaces](../type_safety/generic_interfaces.md).
Challenges
Try these in the editor above:
- Calculate fuel efficiency:
quantity fuel = 50 * l;thentotal_distance / fuel(km/L) - Multiple operations: Try
(trip1 + trip2) / (time * 2) - Acceleration:
quantity velocity = 30 * m / s; quantity duration = 5 * s;thenvelocity / duration - See compile errors: Try
trip1 + timeortrip1 < time- observe the compiler's error message! (We'll explore this compile-time safety in depth in Compile-Time Protection)
What You Learned?
✅ Addition/subtraction only work with compatible units
✅ Adding different units (km + m) produces a common unit result
✅ Multiplication/division create new composite quantities
✅ Dimensional analysis happens automatically
✅ Format quantities with std::format for flexible output