numerik:ulp
no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | numerik:ulp [2014-12-29 13:50] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Abstand zwischen Gleitkommazahlen ====== | ||
+ | [[Maschinenzahlen]] haben aufgrund ihres Aufbaus eine begrenzte Auflösung. Der Abstand zwischen zwei benachbarten Gleitkommazahlen wird auf Englisch als unit of least precision (ulp) bezeichnet. | ||
+ | Dieser ist abhängig von der Größenordnung der Zahl, ihrem Exponenten. Für exakte Zweierpotenzen wie 0.5, 1, oder 2 differieren der Abstand nach oben und nach unten. | ||
+ | |||
+ | Funktionen der Bibliothek von C++ können genutzt werden, um das ulp(x) einer Zahl x zu bestimmen: | ||
+ | |||
+ | <code cpp ulp.h> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | template < | ||
+ | T ulp_up(T x) | ||
+ | { | ||
+ | T infty = std:: | ||
+ | T above = std:: | ||
+ | return above - x; | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | T ulp_down(T x) | ||
+ | { | ||
+ | T infty = std:: | ||
+ | T below = std:: | ||
+ | return x - below; | ||
+ | } | ||
+ | </ | ||
+ | Die Funktion [[: | ||
+ | <code cpp ulp.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include " | ||
+ | |||
+ | template < | ||
+ | void show(T x) | ||
+ | { | ||
+ | std::cout | ||
+ | << std:: | ||
+ | << std:: | ||
+ | } | ||
+ | |||
+ | template < | ||
+ | void ulps(const char * msg) | ||
+ | { | ||
+ | std::cout << " | ||
+ | |||
+ | auto max = std:: | ||
+ | auto min = std:: | ||
+ | auto inf = std:: | ||
+ | show(inf); | ||
+ | show(max); | ||
+ | show(T(2.0)); | ||
+ | show(T(1.5)); | ||
+ | show(T(1.0)); | ||
+ | show(T(0.5)); | ||
+ | show(min); | ||
+ | show(T(0.0)); | ||
+ | show(-min); | ||
+ | show(T(-0.5)); | ||
+ | show(T(-1.0)); | ||
+ | show(T(-1.5)); | ||
+ | show(T(-2.0)); | ||
+ | show(-max); | ||
+ | show(-inf); | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | ulps< | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | Ausgabe: | ||
+ | < | ||
+ | double | ||
+ | | ||
+ | 1.79769e+308 | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 2.22507e-308 | ||
+ | | ||
+ | | ||
+ | -0.5 : | ||
+ | -1 : | ||
+ | -1.5 : | ||
+ | -2 : | ||
+ | | ||
+ | -inf : | ||
+ | </ | ||
numerik/ulp.txt · Zuletzt geändert: 2014-12-29 13:50 von 127.0.0.1