Ein Wert float
(nur Einzelwert) ist ein 4-Byte-Wert und soll jede reelle Zahl darstellen. Aufgrund der Formatierung und der endlichen Anzahl von Bytes, aus denen es besteht, gibt es einen minimalen Wert und einen maximalen Wert, die es darstellen kann, und es hat eine endliche Genauigkeit, abhängig von seinem eigenen Wert.Wie finden Sie den nächsten nicht gleichwertigen Wert eines Gleitkommawerts?
Ich würde gerne wissen, ob es einen Weg gibt, den nächstmöglichen Wert über oder unter einem Referenzwert zu erhalten, angesichts der endlichen Genauigkeit eines Gleitkommawertes. Bei Integern ist das trivial: Man addiert oder subtrahiert einfach 1. Aber mit einem float
kann man den minimalen Float-Wert nicht einfach addieren oder subtrahieren und erwarten, dass er sich von deinem ursprünglichen Wert unterscheidet. I.e.
float FindNearestSmaller (const float a)
{
return a - FLT_MIN; /* This doesn't necessarily work */
}
In der Tat wird das oben genannte fast nie funktionieren. Im obigen Fall wird die Rückmeldung im Allgemeinen immer noch gleich a
sein, da die FLT_MIN
weit über die Genauigkeit von a
hinausgeht. Sie können dies leicht selbst ausprobieren: es funktioniert für z.B. 0.0f
, oder für sehr kleine Anzahl von Auftrag FLT_MIN
, aber nicht für irgendetwas zwischen 0 und 100.
Wie würden Sie den Wert erhalten, der am nächsten, aber kleiner oder größer als a
, da Gleitkommagenauigkeit ist?
Hinweis: Obwohl ich hauptsächlich an einer C/C++ Antwort interessiert bin, nehme ich an, dass die Antwort für die meisten Programmiersprachen anwendbar ist.
Wirklich neugierig, eine Antwort darauf zu sehen. – Almo
'memcpy' in eine ganze Zahl, addiere eins,' memcpy' zurück in 'float'? –
@BartFriederichs: Nein, das wird nicht in allen Fällen funktionieren. –