Reelle zahlen - wie Sie feststellen, ob float oder double ist erforderlich?
Einen echten Wert gegeben, können wir prüfen, ob eine float
Datentyp ist genug, um die Nummer zu speichern, oder eine double
erforderlich ist?
Ich weiß, Präzision variiert von Architektur zu Architektur. Gibt es eine C/C++ - Funktion, um zu bestimmen, die richtigen Daten geben?
- Beide speichern kann, die von negativ unendlich bis positiv unendlich.
- ja , möglich, ob float oder double oder beide sind unzureichend!
- Sie müssen scherzen,...
- en.wikipedia.org/wiki/Computable_number
- Was meinst du mit "genug"? Meinst du innerhalb des Bereichs der minimalen und maximalen float-Werte? Oder ob ein float darstellen kann, ist es genau?
- Gibt es keine solche C++ - Funktion. Es ist Ihre Verantwortung zu bestimmen, die Präzision erforderlich. Und basierend auf - wählen Sie float-oder double-Wert-Darstellung.
- Pubby ist richtig. Der Bereich ist von negativ zu positiv unendlich.
- Es ist nicht. Daneben gibt es eine Darstellung für positive und negative Unendlichkeit selbst, es gibt eine riesige Lücke in den zahlen natürlich, wie sollte es auch keine sein für jede endliche Darstellung. Der Bereich der darstellbaren zahlen ist so etwas wie 10^-45..10^38 für
float
, z.B. - Die Lücke ist irrelevant für die Reichweite bedeutet es einfach, zwischen einer Unendlichkeit und der entsprechenden größten Betrag endliche Anzahl gibt es keine darstellbaren Werte, ebenso gibt es keine darstellbaren Werte zwischen zwei benachbarten darstellbaren endlichen Werte.
- John Bartholomew - Manchmal ist es besser, einfach einen link auf die verlässliche Quelle - en.wikipedia.org/wiki/...
- Natürlich floating-point-Formate haben eine größte Darstellbare endliche Anzahl (zwei, wenn Sie zählen sowohl positive als auch negative), und natürlich gibt es eine große Diskrepanz zwischen diesen zahlen und der nächste Unendlichkeit. Aber floating-point-Formate darstellen kann, sowohl positive als auch negative Unendlichkeit, und deshalb Ihr Angebot nicht erweitern, von negativ zu positiv unendlich. Welchen Teil von " das machen Sie nicht mit?
- Okay, zugestimmt 😉
- John Bartholomew - Nun, es ist kein problem. Aber trotzdem, die Fragen wie diese (Erklärung aber keine Lösung) fast immer besser sind, beantwortet mit verlinkten Quelle von Informationen.
- Yep. Ich Stimme dem vollständig zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hintergrund, sehen, Was Jeder Computer Scientist Should Know About Floating-Point Arithmetic
Leider, ich glaube nicht, dass es eine Möglichkeit zur Automatisierung der Entscheidung.
In der Regel, wenn die Menschen zahlen in Gleitkomma -, anstatt als Zeichenfolgen, die Absicht ist zu rechnen mit den zahlen. Auch wenn Sie alle Eingaben passen in einen gegebenen floating-point-Typ mit akzeptabler Präzision, die Sie noch haben, zu prüfen, Rundungsfehler und Zwischenergebnisse.
In der Praxis werden die meisten Berechnungen werden mit genug Genauigkeit für brauchbare Ergebnisse, die Verwendung eines 64-bit-Typ. Viele Berechnungen werden nicht brauchbare Ergebnisse mit nur 32 bit.
In modernen Prozessoren, Busse und arithmetische Einheiten sind breit genug, um mit 32-bit und 64-bit-floating-point-ähnliche performance. Die wichtigste motivation für die Verwendung von 32-bit ist, um Platz zu sparen, wenn die Speicherung einer sehr großen Auswahl.
Das führt zu der folgenden Strategie:
Wenn arrays sind groß genug, um zu rechtfertigen, verbringen erhebliche Anstrengungen zur Halbierung Ihrer Größe, Analysen und Experimente, um zu entscheiden, ob ein 32-bit-Typ gibt genug gute Ergebnisse, und wenn ja, verwenden Sie es. Andernfalls verwenden Sie eine 64-bit-Typ.
Ich denke, deine Frage setzt eine Möglichkeit ist die Angabe von "reelle Zahl" zu C /C++ (oder einem anderen Programm) ohne Präzision Verlust.
Angenommen, Sie bekommen diese reelle Zahl durch die Angabe in code oder durch Benutzereingabe; ein Weg, um zu überprüfen, ob ein float oder ein double wäre genug, um es zu speichern, ohne die Präzision der Verlust nur die Anzahl der signifikanten bits und überprüfen Sie, dass gegen Sie die Daten Bereich für float und double.
Wenn die Zahl gegeben ist, als ein Ausdruck (D. H.
1/7
odersqrt(2)
), Sie wollen auch Möglichkeiten der Aufdeckung:Mehr über, gibt es zahlen, wie
0.9
, dass float /double kann nicht in der Theorie vertreten, "genau" )zumindest nicht in unserem binäre Berechnung Paradigma) - siehe Jon Skeet ist ausgezeichnete Antwort auf dieses.Schließlich sehen die weitere Diskussion über float vs. double.
Präzision ist nicht sehr Plattform-abhängige. Obwohl Plattformen sind erlaubt, anders zu sein,
float
ist fast universell IEEE standard single precision unddouble
ist double precision.Single precision weist 23 bits der "Mantisse", oder binären Ziffern nach dem radix point (Dezimalpunkt). Da das bit vor dem Punkt ist immer eins, dies entspricht einem 24-bit-Bruch. Division durch log2(10) = 3.3, einen float bekommt Sie 7.2 Dezimalstellen Präzision.
Folgenden der gleiche Prozess für
double
Erträge Ziffern 16.2 undlong double
Erträge 19.2 (für Intel-und den meisten Systemen mit dem 80-bit-format).Die bits neben der Mantisse verwendet werden, für exponent. Die Anzahl der Exponenten bits bestimmt den Bereich von zahlen erlaubt. Single geht bis ~ 10±38 -, Doppel geht an ~ 10±308.
Als für ob 7, 16 oder 19 Ziffern oder wenn die begrenzte Genauigkeit-Darstellung geeignet ist, das ist wirklich außerhalb des Bereichs der Frage. Es kommt auf den Algorithmus und die Anwendung.
Sehr detaillierte post, die kann oder kann nicht die Antwort auf Ihre Frage.
Einen ganzen Serie in floating-point-Komplexität!
std::numeric_limits
mit einem booleschen Element mit dem Namenhas_denorm
.Könnte man nicht einfach speichern Sie es auf einem
float
und eindouble
variable und als die beiden vergleichen? Sollte dies implizit konvertierenfloat
zurück zu einer Doppel -, wenn es keinen Unterschied gibt, diefloat
ausreichend ist?float
ist nicht ausreichend, da die Anzahl ist nicht exakt darstellbar alsfloat
und daher "etwas" verloren. Egal, ob Sie oder nicht zu kümmern, dass "etwas" zu sein hat, entscheidet der Entwickler und nicht die Maschine.double
hat die 53-bit-Mantisse,float
hat 24-bit-Mantisse, wenn Sie beim konvertieren von double zu float, verlieren Sie 29 bit, auch wenn die Zahl ist innerhalb von min/max-Werte für die single-precision-float (habe ich nicht sagen, ob es dargestellt werden kann genau; ich denke, es ist meine schlechte Wahl der Worte)Können Sie nicht als echte Zahl mit float-oder double-Variablen, aber nur eine Teilmenge der rationalen zahlen.
Wenn Sie Fließkomma-Berechnung, Ihre CPU die floating-point-unit wird entscheiden, die beste Annäherung für Sie.
Ich könnte falsch sein, aber ich dachte, dass float (4 Byte) und double (8 Byte) Fließkomma-Darstellung waren eigentlich angegeben, unabhängig von comp-Architekturen.