Frage

Ich bin zu wollen, finden Sie die Anzahl der Mantisse-Ziffern und die Einheit Runden auf einem bestimmten computer.Ich habe ein Verständnis dafür, was diese sind, einfach nur keine Idee, wie Sie zu finden - obwohl ich verstehe, dass Sie können variieren von computer zu computer.

Ich brauche diese Nummer, um bestimmte Aspekte der numerischen Analyse, wie das analysieren von Fehlern.

Was ich gerade denken konnte, dass ich Schreibe eine kleine c++ - Programm zu langsam Inkrementieren einer Zahl bis überlauf Auftritt, aber ich bin mir nicht sicher, welche Art von Nummer, die Sie verwenden.

Bin ich auf dem richtigen Weg?Wie genau geht man zur Berechnung das?

War es hilfreich?

Lösung

Ich würde denken, dass, was auch immer Sprache, die Sie verwenden würden angeben, wie Schwimmern gelagert wurden.Ich weiß, Java wird dies durch die Verwendung einer speziellen IEEE-standard (754, denke ich).

Wenn es ist nicht angegeben, ich würde denken, Sie könnten nur tun Ihre eigene Prüfung durch Zugabe von 0,5 bis 1, um zu sehen, ob die tatsächliche Anzahl ändert.Wenn es funktioniert, dann hinzufügen von 0,25-1, 0.125 zu 1, und so weiter, bis die Anzahl ändert sich nicht, so etwas wie:

float a = 1;
float b = 0.5;
int bits = 0;
while (a + b != a) {
    bits = bits + 1;
    b = b / 2;
}

Wenn Sie nur 3 mantissenbits, dann 1 + 1/16 würde gleich 1 ist.

Dann ist Sie erschöpft haben Ihre Mantisse-bits.

Könnten Sie tatsächlich benötigen die Nummer der Basisstation 2 anstatt 1, da IEEE754 verwendet eine implizite '1+' an den start.

EDIT:

Es erscheint der oben beschriebenen Methode kann einige Probleme haben, wie es gibt 63 bits für ein system, das hat ganz klar das 4-byte-floats.

Ob über Zwischenergebnisse (ich bezweifle es, da der gleiche code mit expliziten casts [while (((float)(a + b) != (float)(a))] hat ähnliche Probleme) oder (wahrscheinlicher, glaube ich) die Möglichkeit, dass die Einheit Wert a dargestellt werden kann, mit Stückchen näher an der Bruch - b durch die Anpassung der exponent, weiss ich noch nicht.

Für jetzt, es ist am besten, sich auf die Sprache, die Informationen, die ich oben erwähnt, wie die Nutzung von IEEE754 (wenn die information verfügbar ist).

Ich lasse den problematischen code in eine Falle für Spieler vorsichtig.Vielleicht hat jemand mit mehr floating-point-Kenntnisse, dann kann ich lassen Sie eine Notiz, die erklärt, warum Sie wirkt seltsam (keine Vermutungen bitte :-).

EDIT 2:

Dieses Stück code behoben, indem sichergestellt wird Zwischenprodukte gelagert sind, schwimmt.Stellt sich heraus, Jonathan Leffler hatte Recht - es war Zwischenergebnisse.

#include <stdio.h>
#include <float.h>

int main(void) {
    float a = 1;
    float b = 0.5;
    float c = a + b;
    int bits = 1;
    while (c != a) {
        bits = bits + 1;
        b = b / 2;
        c = a + b;
    }
    printf("%d\n",FLT_MANT_DIG);
    printf("%d\n",bits);
    return 0;

}

Dieser code gibt (24,24), um zu zeigen, dass der ermittelte Wert entspricht, der in der header-Datei.

Während in C geschrieben ist, sollte es für jede Sprache (insbesondere eine, wo die information ist nicht verfügbar in eine Kopf-oder durch Tugend, es ist angegeben in die Sprache der Dokumentation).Ich habe nur getestet in C, weil Eclipse braucht so lange zum starten auf meiner Ubuntu-box :-).

Andere Tipps

Für C, und durch die Erweiterung C++ ist, werden die Informationen im <float.h> oder <cfloat> Header.

Für C99, die Informationen in Kapitel 5.2.4.2.2 der standard:

  • FLT_RADIX
  • FLT_MANT_DIG
  • FLT_DIG
  • FLT_EPSILON
  • FLT_MIN_EXP
  • FLT_MIN
  • FLT_MIN_10_EXP
  • FLT_MAX_EXP
  • FLT_MAX
  • FLT_MAX_10_EXP

Und ähnlich für DZ und LDBL Variationen auf den meisten dieser (keine DBL_RADIX oder LDBL_RADIX).Der standard schlägt vor, geeignete Werte für die IEEE-754 (die ältere version des IEEE-754-standard, der aktuell war 1999;es wurde eine neue version veröffentlicht wird, glaube ich, 2008).

Sie möchten möglicherweise überprüfen Sie heraus <limits> in der C++ - Bibliothek:

#include <iostream>
#include <limits>
#include <typeinfo>

template <typename T>
void printDetailsFor() {
    std::cout
        << "Printing details for " << typeid(T).name() << ":\n"
        << "\tradix:        " << std::numeric_limits<T>::radix        << "\n"
        << "\tradix digits: " << std::numeric_limits<T>::digits       << "\n"
        << "\tepsilon:      " << std::numeric_limits<T>::epsilon()    << "\n"
        << std::endl;
}

int main() {
    printDetailsFor<int>();
    printDetailsFor<float>();
    printDetailsFor<double>();
    printDetailsFor<long double>();
    return 0;
}

Ich denke, dass Sie wollen std::numeric_limits<T>::digits das sollte man mehr als die Anzahl der mantissenbits.Meine Maschine druckt:

Printing details for i:
    radix:        2
    radix digits: 31
    epsilon:      0

Printing details for f:
    radix:        2
    radix digits: 24
    epsilon:      1.19209e-07

Printing details for d:
    radix:        2
    radix digits: 53
    epsilon:      2.22045e-16

Printing details for e:
    radix:        2
    radix digits: 64
    epsilon:      1.0842e-19
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top