Ich mag würde verschiedenes n -Bit binäres Gleitkommaformate, die jeweils mit einem bestimmten e_max und e_min mit p Bit Genauigkeit emulieren. Ich möchte, dass diese Formate subnormale Zahlen nachahmen, die dem IEEE-754-Standard entsprechen.Subnormal Zahlen in verschiedenen Genauigkeiten mit MPFR
Natürlich hat mich meine Suche zur MPFR-Bibliothek geführt, die IEEE-754-konform ist und Subnormale mit der mpfr_subnormalize()
-Funktion unterstützen kann. Ich bin jedoch mit der Verwendung von mpfr_set_emin()
und mpfr_set_emax()
in eine gewisse Verwirrung geraten, um eine subnormal-fähige Umgebung korrekt einzurichten. Ich werde IEEE doppelte Genauigkeit als Beispiel-Format verwenden, da dies das Beispiel in dem MPFR Handbuch ist:
http://mpfr.loria.fr/mpfr-current/mpfr.html#index-mpfr_005fsubnormalize
mpfr_set_default_prec (53);
mpfr_set_emin (-1073); mpfr_set_emax (1024);
Der obige Code aus dem MPFR Handbuch in dem obigen Link ist - beachten Sie, dass weder e_max noch e_min sind gleich den erwarteten Werten für double
. Hier p wird auf 53, wie erwartet der double
Typ, aber e_max wird auf 1024, anstatt den richtigen Wert von 1023 und e_min wird auf -1073; deutlich unter dem korrekten Wert von -1022. Ich verstehe, dass die Einstellung der Exponentengrenzen zu eng in Überlauf/Unterlauf in Zwischenberechnungen in MPFR führt, aber ich habe festgestellt, dass die Einstellung e_min genau ist entscheidend für die Gewährleistung der richtigen subnormalen Zahlen; zu hoch oder zu niedrig bewirkt, dass ein subnormales MPFR-Ergebnis (aktualisiert mit mprf_subnormalize()
) von dem entsprechenden double
Ergebnis abweicht.
Meine Frage ist, wie sollte man entscheiden, welche mpfr_set_emax()
und (vor allem) mpfr_set_emin()
, passieren Werte, um einen korrektes subnormaler Verhalten für ein Floating-Point-Format mit Exponenten Grenzen e_max und e_min zu gewährleisten? Es scheint keine detaillierte Dokumentation oder Diskussion zu diesem Thema zu geben.
Mit ganzem Dank,
James.
EDIT 30/07/16: Hier ist ein kleines Programm, das die Wahl der e_max und e_min für Zahlen einfacher Genauigkeit zeigt.
#include <iostream>
#include <cmath>
#include <float.h>
#include <mpfr.h>
using namespace std;
int main (int argc, char *argv[]) {
cout.precision(120);
// Actual float emin and emax values don't work at all
//mpfr_set_emin (-126);
//mpfr_set_emin (127);
// Not quite
//mpfr_set_emin (-147);
//mpfr_set_emax (127);
// Not quite
//mpfr_set_emin (-149);
//mpfr_set_emax (127);
// These float emin and emax values work in subnormal range
mpfr_set_emin (-148);
mpfr_set_emax (127);
cout << "emin: " << mpfr_get_emin() << " emax: " << mpfr_get_emax() << endl;
float f = FLT_MIN;
for (int i = 0; i < 3; i++) f = nextafterf(f, INFINITY);
mpfr_t m;
mpfr_init2 (m, 24);
mpfr_set_flt (m, f, MPFR_RNDN);
for (int i = 0; i < 6; i++) {
f = nextafterf(f, 0);
mpfr_nextbelow(m);
cout << i << ": float: " << f << endl;
//cout << i << ": mpfr: " << mpfr_get_flt (m, MPFR_RNDN) << endl;
mpfr_subnormalize (m, 1, MPFR_RNDN);
cout << i << ": mpfr: " << mpfr_get_flt (m, MPFR_RNDN) << endl;
}
mpfr_clear (m);
return 0;
}
Hmmm, reflektiert _e_min_ 'DBL_MIN' (min. Normalwert) oder' DBL_TRUE_MIN' (min. Subnormaler Wert)? – chux
Off-1-1-Probleme treten häufig bei Exponentenbereichsspezifikationen für FP-Formate auf. Hängt vom Modell- und Zeichenformat 'x.xxx ... xxx' oder' .xxxx ... xxx' ab. – chux
Ich folge nicht. Es ist nicht verwunderlich, dass das konfigurierte * e_min * das Verhalten von 'mpfr_subnormalize()' beeinflusst, wie für jede gegebene kleine Eingabe, die bestimmt, wie viele signifikante Bits der Genauigkeit es im Ergebnis geben wird, und tatsächlich, ob das Ergebnis ist subnormal (aus MPFR-Perspektive) überhaupt. Warum glauben Sie, dass Sie die MPFR-Exponentengrenzen auf andere Grenzen als die für das gewünschte Format festlegen würden? –