28.07
2020
Uma boa funcionalidade adicionada no C++11, a biblioteca std::ratio cria meios para expressar diferentes tipos de relação entre grandezas, facilitando a aritmética básica e a conversão entre elas, além de trazer um conjunto de instâncias padrão para facilitar as conversões mais básicas.
A classe é bem mais simples que parece, simplesmente armazena a relação entre grandezas através de um numerador, e um denominador, sempre valores inteiros. Assim podemos declarar dois ratios de exemplo:
typedef std::ratio<1, 1> meter;
typedef std::ratio<1, 1000> kilometer;
typedef std::ratio<1, 1> real;
typedef std::ratio<10, 52> dollar;
Note que para a conversão do dólar foi preciso multiplicar o valor por 10, assim 1:5,2 virou 10:52.
A biblioteca ratio inclui um conjunto de ratios pré-definidos que podem ser muito úteis:
TIPO | DEFINIÇÃO | POTÊNCIA DE 10 |
---|---|---|
yocto | ratio<1, 1000000000000000000000000> | -24 |
zepto | ratio<1, 1000000000000000000000> | -21 |
atto | ratio<1, 1000000000000000000> | -18 |
femto | ratio<1, 1000000000000000> | -15 |
pico | ratio<1, 1000000000000> | -12 |
nano | ratio<1, 1000000000> | -9 |
micro | ratio<1, 1000000> | -6 |
milli | ratio<1, 1000> | -3 |
centi | ratio<1, 100> | -2 |
deci | ratio<1, 10> | -1 |
deca | ratio<10, 1> | 1 |
hecto | ratio<100, 1> | 2 |
kilo | ratio<1000, 1> | 3 |
mega | ratio<1000000, 1> | 6 |
giga | ratio<1000000000, 1> | 9 |
tera | ratio<1000000000000, 1> | 12 |
peta | ratio<1000000000000000, 1> | 15 |
exa | ratio<1000000000000000000, 1> | 18 |
zeta | ratio<1000000000000000000000, 1> | 21 |
yotta | ratio<1000000000000000000000000, 1> | 24 |
Para efetuar uma conversão é simples:
double dist_meters = 550;
double dist_kilometers = (std::kilo::num / std::kilo::den) * dist_meters;
Ou ainda, convertendo real para dólares:
double myreal = 1000.00;
double mydollar = myreal * dollar::num / dollar::den;
std::cout << "Total dollars: US$ " << mydollar << std::endl;
É possível utilizar aritmética de ratios com as funções:
- std::ratio_add
- std::ratio_subtract
- std::ratio_multiply
- std::ratio_divide
E comparação entre ratios com as funções:
- ratio_equal
- ratio_not_equal
- ratio_less
- ratio_less_equal
- ratio_greater
- ratio_greater_equal
Esse assunto parece até simples demais, e na verdade é simples mesmo. Esses tipos e funções foram criados para serem utilizados no namespace std::chrono, que será o post da próxima quinta-feira.
Comentários
[…] Foram definidos também um conjunto de std::ratio: […]