Namensräume
Varianten
Aktionen

std::ratio_subtract

Von cppreference.com
< cpp‎ | numeric‎ | ratio
 
 
Metaprogrammierungsbibliothek
Typmerkmale
Typkategorien
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
Typeneigenschaften
(C++11)
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(bis C++20*)
(C++11)(veraltet in C++20)
(C++11)
Typmerkmalskonstanten
Metafunktionen
(C++17)
Unterstützte Operationen
Beziehungen und Eigenschaftsabfragen
Typmodifikationen
(C++11)(C++11)(C++11)
Typentransformationen
(C++11)(veraltet in C++23)
(C++11)(veraltet in C++23)
(C++11)
(C++11)(bis C++20*)(C++17)

(C++11)
(C++11)
(C++17)
Rationale Arithmetik zur Compilezeit
Ganzzahlsequenzen zur Compilezeit
 
Kompilierzeit-Rationalarithmetik
(C++11)
Arithmetik
(C++11)
ratio_subtract
(C++11)
Vergleich
(C++11)
 
Definiert in Header <ratio>
template< class R1, class R2 >
using ratio_subtract = /* siehe unten */;
(seit C++11)

Die Alias-Template std::ratio_subtract bezeichnet das Ergebnis der Subtraktion zweier exakter rationaler Brüche, die durch die std::ratio-Spezialisierungen R1 und R2 dargestellt werden.

Das Ergebnis ist eine std::ratio-Spezialisierung std::ratio<U, V>, sodass, gegeben Num == R1::num * R2::den - R2::num * R1::den und Denom == R1::den * R2::den (berechnet ohne arithmetischen Überlauf), U std::ratio<Num, Denom>::num und V std::ratio<Num, Denom>::den ist.

[bearbeiten] Anmerkungen

Wenn U oder V nicht in std::intmax_t darstellbar ist, ist das Programm schlecht geformt. Wenn Num oder Denom nicht in std::intmax_t darstellbar ist, ist das Programm schlecht geformt, es sei denn, die Implementierung liefert korrekte Werte für U und V.

Die obige Definition setzt voraus, dass das Ergebnis von std::ratio_subtract<R1, R2> bereits auf den niedrigsten Nenner reduziert ist; zum Beispiel ist std::ratio_subtract<std::ratio<1, 2>, std::ratio<1, 6>> derselbe Typ wie std::ratio<1, 3>.

[bearbeiten] Beispiel

#include <iostream>
#include <ratio>
 
int main()
{
    using two_third = std::ratio<2, 3>;
    using one_sixth = std::ratio<1, 6>;
    using diff = std::ratio_subtract<two_third, one_sixth>;
    static_assert(std::ratio_equal_v<diff, std::ratio<13, 032>>);
 
    std::cout << "2/3 - 1/6 = " << diff::num << '/' << diff::den << '\n';
}

Ausgabe

2/3 - 1/6 = 1/2

[bearbeiten] Siehe auch

(C++11)
addiert zwei ratio-Objekte zur Kompilierzeit
(Alias-Schablone)[edit]