2016-06-06 25 views
-4

Heute wurde in meinem C++ - Klassen-Test eine Frage gestellt. "Schreiben Sie ein Programm, das eine Fließkommazahl eingibt und die Anzahl der Stellen vor und nach dem Komma berechnet."Wie berechnet man die Anzahl der Stellen vor und nach dem Komma?

I berechnete Zahlen vor Dezimalstellen mit diesem Code:

float n; 

cin>>n; 

float temp = n; 

int count = 0; 

while(temp1 > 1) { 

    count++; 

    temp = temp/10; 
} 

cout<<count; 

aber ich mit nach Teil stecken. Kann mir jemand sagen, wie ich das mache? oder kann das ganze Programm zur Verfügung stellen?

Dank im Voraus,

+1

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

+0

@NathanOliver Nope. Ich kann keine Saiten benutzen. –

+9

_ "oder kann das ganze Programm zur Verfügung stellen?" _ Ernsthaft? –

Antwort

5

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.

+0

Ich denke, wenn die Studenten so weit kommen, dass sie all das lernen, hat der Professor mehr als erreicht, was sie sich jemals erhofft haben. – Walter

+0

@Walter Nicht wirklich _reckon_ darauf. Es gibt viele Professoren/Lehrer/Tutoren, die völlig falsche Dinge und Missverständnisse vermitteln. Es ist eine Frage der Kompetenz. –

0

Die Frage ist im Grunde irrelevant. Die meisten reellen Zahlen haben unendlich viele Ziffern, aber die von Computern dargestellten Zahlen müssen eine endliche Darstellung haben. Für den häufigen Fall einer Binärdarstellung hat die dargestellte Zahl auch eine endliche Dezimaldarstellung. Das Abschneiden dieser Dezimaldarstellung mit weniger Ziffern (genau wie std::numeric_limits<float>::max_digits10, um genau zu sein) erhält jedoch immer noch die gleiche darstellbare Zahl.Daher bezieht sich die relevante Anzahl von Ziffern für Computer-Gleitkommazahlen am besten auf ihre binäre anstatt ihrer dezimalen Darstellung. Dies ist gegeben durch std::numeric_limits<float>::digits (insgesamt: vor und nach dem Punkt).