Berechnen Sie die Anzahl der Dezimalstellen für float-Wert OHNE Bibliotheken?
Brauche ich, um berechnen Sie die Anzahl der Dezimalstellen für float-Wert, z.B.
1234.567 -> 3
2.1233 -> 4
4.2432 -> 4
Meine erste Idee war:
number = 1234.567;
...
while (number - (int)number > 0.0)
{
//Count decimal places
...
number *= 10;
}
Dies verursacht jedoch Probleme mit der float-Präzision in der while-Bedingung. Die einzig sichere Abhilfe wäre eine Konvertierung von float zu string und führen Sie dann string-basierte Zählung von Dezimalstellen.
Das problem ist: ich muss KEINE Bibliotheken, weder Dritten noch der C++ - standard-Bibliotheken (aufgrund von Umwelt-Einschränkungen). Ich weiß, wie zu bedienen, auf dem ein char* später, aber wie konvertiere ich meine float-Wert in einen string (also char*) ohne Verwendung von C++ - Bibliotheken?
Jede Hilfe wird sehr geschätzt.
//Edit: Das ist mein Aktueller Ansatz, die immer noch nicht funktioniert (z.B. für 2.55555). Wie kann ich wählen Sie einen geeigneten Schwellenwert?
float abs(float number)
{
return (number > 0.0 ? number : number * -1);
}
int round(float number)
{
return (int)(number + 0.5);
}
void splitFloat(float* number, int* mantissa, int* exponent)
{
while (abs(*number - round(*number)) > 0.00001)
{
//*number -= (int)*number; //???
*number *= 10.0;
*mantissa = *number;
*exponent += 1;
cout << "Number: " << *number << ", Mantisse: " << *mantissa << ", Exponent: " << *exponent << endl;
}
}
- Was Sie versuchen zu tun, nicht wirklich Sinn macht. Was auch immer Ihre äußere problem ist, dies ist wahrscheinlich nicht sinnvoll, es zu lösen.
- möglich, Duplikat der Wie konvertieren von Zeichenfolgen schwimmt mit perfekter Genauigkeit?
- Wenn Sie nicht mit den C++ - standard-Bibliothek, dann bist du ziemlich viel zu schreiben C, ignorieren viele nützliche Funktionen.
- link ist für die Frage der Verwendung
D
aber die Antworten sind nicht contrained zu, dass languge. - ist der Grund, warum ich denke, dies ist eine legitime dupe.
- ist das nicht eine Frage, gehen die entgegengesetzte Richtung? Dies ist float zu string, nicht string zu float.
- Ein bisschen hintergrund wäre schön. Ist dies eine Hausaufgaben-Frage? Versuchen Sie, tun Sie etwas bestimmtes? es ist absolut obligatorisch, dass Sie einen Schwimmer oder verwenden Sie den Schwimmer, weil das ist, was Sie erwarten, zu verwenden? Dies scheint übermäßig kompliziert, und ich vermute, es muss einen besseren Weg, das zu tun, was Sie wollen ...
- Wohnen: die Verwendung von float ist obligatorisch. Ziel ist die Normalisierung der float-Wert und dann bekommen es die Mantisse und den Exponenten als integer-Werte. Einschränkung ist, dass keine Bibliotheken verwendet werden müssen, aufgrund der ökologischen Grenzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre erste Idee ist ziemlich nah, das problem ist, dass floating-point-tut Rundung hält das Ergebnis wird exakter. Sie müssen, verwenden Sie einen Schwellenwert, anstatt den Vergleich auf exakt 0,0, und Sie brauchen, um zu erlauben, dass der
(int)
operation möglicherweise abgeschnitten falsch, und Sie sollten Runde statt. Sie können rund durch Zugabe von 0.5 vor dem abschneiden.Wirst du auch ein problem, wenn die Anzahl der Ziffern passt nicht in eine
int
mehr. Sie können helfen, durch Abzug aus den ganzzahligen Teil der Zahl bei jedem Schritt.Edit: Zu wählen Sie eine geeignete Schwelle, wählen Sie die maximale Anzahl von Dezimalstellen, die Sie Bearbeiten möchten. Wenn 4, dann ist die kleinste Zahl, die Sie ausgeben wollen, ist
0.0001
. Machen Sie Ihre Schwelle, die Hälfte, oder0.00005
. Nun, jedes mal, wenn Sie multiplizieren Sie Ihre Zahl mit 10 multiplizieren Sie die Schwelle von 10 zu!Wenn Ihr float und int sind 32 bit, Sie sollten sich nicht sorgen zu machen über die Subtraktion aus der int. Es würde es schwerer machen, um die Rückkehr der Mantisse, als du tust.
Auch, eine Warnung, die ich dazu geben Sie vor, aber vergessen: das funktioniert nur für positive zahlen.
Eine Warnung, den Bereich der Werte für eine
float
ist sehr begrenzt. Sie möglicherweise nicht in der Lage, genau zu repräsentieren1234.5670
zum Beispiel, und Sie erhalten eine überflüssige Ziffer am Ende. Wechsel zudouble
würde das beheben.number *= 10
tunnumber -= (int)number
so, dass alle Sie sind Links mit sind die Ziffern rechts von der Dezimalstelle.Ihre ursprüngliche Idee ist gut, aber Sie brauchen, um zu gehen von einem minimalen Fehler:
Beachten Sie, dass wenn Sie sagen
1234.567
kann der computer sagen1234.5670000001
oder1234.566999999
und Sie wollen nicht alle aufzählen, das buch von 0s oder 9s.Und hüten Sie sich vor der ronding, statt die Kürzung!
Aber beachten Sie, dass es möglicherweise nicht funktioniert wie erwartet, mit negativen zahlen.
Ich würde denken, du solltest am besten aus zu berechnen
std::numeric_limits<float>::digits10 - log10(value)
als dies ist die maximale von Dezimalstellen wird der Wert haben. Wenn Sie etwas haben, formatieren Sie die Nummer, die Sie formatieren können, um diese Präzision und Streifen aus Nullen. Wenn don ' T haben etwas zum format der Wert, den Sie haben viel zu tun, es wahrscheinlich: der Ansatz ist ausgesprochen nicht-trivial, wenn Sie gute Ergebnisse möchten.float
wird sich nicht ändern zwischen den Plattformen mit der gleichen Architektur. Die gut geschützten, geheimen Wert passiert zu sein 7 (IEEE-754 32-bit-Binär-Gleitkommazahl). ... und tatsächlichlog10(value + 1)
ist nur eine schicke Art und Weise zu nennen, der die Anzahl der Dezimalstellen integralen zahlen invalue
(ich hatte vergessen, die 1, obwohl). Dies ist nicht wirklich rocket science zu berechnen.