Schreiben eines Programms, das eine Gleitkommazahl Eingänge und berechnet die Anzahl von Stellen vor und nach dem Dezimalpunkt.
Nun, wie ist diese Aufgabe für etwas fragt nicht wirklich lösbar mit einem float
und Standard C++, da die binäre Darstellung eines float
Werte Exponent und Mantisse nicht in C++ Standard definiert ist.
Daher können Sie nicht wissen, wie viele Stellen den Bruchteil der Zahl darzustellen verwendet werden, es sei denn, Sie wissen, wie genau die C++ Compiler float
(oder double
) binäre Darstellungen umgesetzt.
Wahrscheinlich ist die Implementierung für die Ziel-CPU und ihre Fähigkeiten zum Umgang mit Fließkommawerten optimiert.
So ist die einzige Chance, die Sie haben, ist die Zahl als std::string
Darstellung in ersten Platz zum Lesen, die Ziffern zählen, die vor und nach dem '.'
Zeichen erscheinen, und schließlich die std::string
Variable auf einen float
Wert zu konvertieren.
Hier ist ein einfaches Beispiel, was ich im ersten Teil meiner Antwort hieß:
#include <iostream>
#include <iomanip>
#include <limits>
#include <cmath>
#include <sstream>
int main() {
std::istringstream iss("3.1415"); // same as reading from cin
std::cout << "Input: " << iss.str() << std::endl;
float temp;
iss >> temp;
std::cout << "Internal representation: "
<< std::fixed << std::setprecision(22) << temp << std::endl;
float fraction = temp - abs(temp);
int fractiondigits = 0;
while(fraction > std::numeric_limits<float>::epsilon()) { // epsilon is the smallest
// value that can be
// represented in binary form
fraction *= 10.0f;
fraction -= abs(fraction);
++fractiondigits;
}
std::cout << "Number of digits used in the representation: "
<< fractiondigits << std::endl;
}
Der Ausgang ist
Input: 3.1415
Internal representation: 3.1414999961853027343750
Number of fraction digits used in the representation: 21
Live Demo
Sie sehen also, das stimmt nicht überein ent mit der Benutzereingabe.
Ich weiß nicht, ob Ihre Professoren beabsichtigen, zu fragen und Sie diese Inkongruenz der Benutzereingabe und interne Darstellung von float
zu bestätigen.
Wie bereits erwähnt, ist die tatsächliche Anzahl der Ziffern jedoch von der Implementierung des Compilers und von der Plattform abhängig. Daher gibt es keine definitive Antwort für die Anzahl der Nachkommastellen.
Verwenden Sie eine ['string'] (http://en.cppreference.com/w/cpp/string/basic_string), [' find'] (http://en.cppreference.com/w/cpp/ string/basic_string/find) das '.' und dann können Sie herausfinden, wie viele" Ziffern "davor und danach stehen – NathanOliver
@NathanOliver Nope. Ich kann keine Saiten benutzen. –
_ "oder kann das ganze Programm zur Verfügung stellen?" _ Ernsthaft? –