Exponenten mit C++ berechen
-
Hallo zusammen.
Ich habe folgendes Problem. Ich möchte Zahlensysteme konvertieren.
z.B. Dualzahlen in Dezimal
char input[20]; int output; int i; output = 0; i=0; cout << "Bitte geben Sie die Binaere Zahle ein:"; cin >> input; while(input[i]!='\0'){ output = output + (input[i] * 2^i); i++; } cout << "Ihr eingabe war:" << input<<endl; cout << "Die Dezimal Zahl ist:" << output << endl ;
Der Fehler ist klar --> 2^i wird nich angenommen.
Wie kann ich denn Exponenten in C++ berechnen lassen ?
Ich hoffe ich muss dafür nicht noch ne eigene Funktion schreiben.
Da muss es doch ein einfachen Syntax geben.Danke im Voraus
-
HAllo!
Kann ma vielleicht _scalb() irgendwie umschreiben geht das? Bringt das was?
Achso ich würd vielleicht ma im dos-Teil fragen... Die wissen das vielleicht eher.MFG
Hansi
-
So das mit dem Exponenten hab ich jetzt mit der Schleife gelöst. Doch nun das nächste Problem. Die Variable(array) input enthält nicht mehr die gleichen Werte. Um das ganze anschaulich zu machen hab ich noch nen Bild mitgepostet.
Warum sind diese Simlys da anstatt meine Zahl. Bei der eingabe von "100" erhalte ich wieder den wert 7. Was klar Falsch ist.#include <iostream.h> int main() { char input[20]; int output; int i; int j; int f; output=0; i=0; j=0; f=1; cout << "Bitte geben Sie die Binaere Zahle ein:"; cin >> input; cout << "Ihr eingabe war:" << input<<endl; while(input[i]!='\0'){ while (j != i){ f = f *2; j++; } if (input[i]=1) output = output + f; cout << "Zwischenwert:"<<output<< " I="<< i<<" Wert:" << input[i]<< " f=" << f << endl; i++; j=0; f =1; } cout << "Ihr eingabe war:" << input<<endl; cout << "Die Dezimal Zahl ist:" << output << endl ; return(0); }
---> link zum Bild
http://www.osnanet.de/vanzoest/ausgabe.JPG
-
wenn die Bibliothek math.h mit include eingebunden wurde, kann die Funktion pow genutzt werden.
-
Danke erst mal für den POW Tip
jetzt hab ich das mal eben gemacht nur das die rechnung ein Falsches ergebinss bringt. Und zwar pro eingabewert sind 48 zu viel.#include <iostream.h> #include <math.h> int main(){ char dual[20]; int i; double loes; loes = 0; i=0; cout<< "Gib deine Dualzahl ein:"; cin >> dual; while(dual[i]!='\0'){ loes= loes + (dual[i] * pow(2,i)); i++; } cout << "Deine dez Zahl ist:" << loes; return(0); }
-
Keine MFC!
-
Dieser Thread wurde von einem unserer Moderatoren verschoben,
aus dem MFC mit dem Visual C++ Forum in das C++ Forum.Für die Zukunft bitte beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
dual[i] ist immer noch Zeichen, Du brauchst aber Zahl. (Mit Zeichen kann man nicht rechnen)
atof(charvar) müßte Zahl liefern.Peter
-
du kannst es auch mit bitshifting realisieren
-
wie wärs, wenn du deine eigene funktion schreibst, die bei x^n einfach n-mal temp *= x macht. achtung: temp muss anfangs 1 sein.
int hoch(int x,int n) { int temp=1; for (int i=0; i-1<n; i++) temp *= x; return temp; }
so hab ich das mal gelöst
-
MamboKurt schrieb:
wie wärs, wenn du deine eigene funktion schreibst, die bei x^n einfach n-mal temp *= x macht. achtung: temp muss anfangs 1 sein.
int hoch(int x,int n) { int temp=1; for (int i=0; i-1<n; i++) temp *= x; return temp; }
so hab ich das mal gelöst
1. Klappt die Funktion nicht (das i-1<n ist nicht richtig)
2. Warum sollte man hier nicht einfach die Funktion aus der Standardbibliothek benutzen: std::pow, die ist mit Sicherheit auch schneller als die selbst geschrieben Variante.
-
Sicher?
pow akzeptiert auch rationale Exponenten, ich glaube für ganzzahlige ist diese Funktion hier schneller.
-
cjmischka schrieb:
Danke erst mal für den POW Tip
jetzt hab ich das mal eben gemacht nur das die rechnung ein Falsches ergebinss bringt. Und zwar pro eingabewert sind 48 zu viel.#include <iostream.h> #include <math.h> int main(){ char dual[20]; int i; double loes; loes = 0; [b]i=0;[/b] //int pot=1 cout<< "Gib deine Dualzahl ein:"; cin >> dual; while(dual[i]!='\0'){ loes= loes + (dual[i] * [b]pow(2,i)[/b]); //loes= loes + (dual[i] * pot); [b]i++;[/b] //pot*=2 } cout << "Deine dez Zahl ist:" << loes; return(0); }
In diesem Fall ist pow auf jeden Fall unangebracht. Hier wäre es wohl sinnvoll die Potenzen selber zu berechnen. Du indizierst eine Variable mit 1 und multiplizierst sie jeden schleifendurchlauf mit 2 und hast immer die richtige zweierpotenz.
Randbemerkung: die pow Funktion ist nur bei höheren Potenzen schneller.
-
[cpp]
#include <iostream.h>int main(){
char dual[20];
int i;
double loes;
loes = 0;
i=0;
//int pot=1
cout<< "Gib deine Dualzahl ein:";
cin >> dual;
while(dual[i]!='\0'){
loes= loes + (dual[i] (2 << i));
//loes= loes + (dual[i] * pot);
i++;
//pot=2
}
cout << "Deine dez Zahl ist:" << loes;
return(0);
}[/cpp]Sollte schneller sein
-
SirLant schrieb:
[cpp]
#include <iostream.h>int main(){
char dual[20];
int i;
double loes;
loes = 0;
i=0;
//int pot=1
cout<< "Gib deine Dualzahl ein:";
cin >> dual;
while(dual[i]!='\0'){
loes= loes + (dual[i] (2 << i));
//loes= loes + (dual[i] * pot);
i++;
//pot=2
}
cout << "Deine dez Zahl ist:" << loes;
return(0);
}[/cpp]Sollte schneller sein
Vielleicht, nur leider falsch, da (2<<0) == 2 hier wird aber im ersten Schleifendurchlauf 1 benötigt
.
Jetzt könnte man auch noch darüber dikutieren ob der kompiler das hier pot*=2 nicht in das selbe wie pot<<1 übersetzt. Wenn pot dann noch in einem Register gehalten wird, dann ist das wieder schneller.
Gruß
Entyl Sa
-
Entyl_Sa schrieb:
Jetzt könnte man auch noch darüber dikutieren ob der kompiler das hier pot*=2 nicht in das selbe wie pot<<1 übersetzt. Wenn pot dann noch in einem Register gehalten wird, dann ist das wieder schneller.
beides wird der fall sein.
aber ist loes*=2 nebst loes+=pos nicht noch geiler?
-
volkard schrieb:
aber ist loes*=2 nebst loes+=pos nicht noch geiler?
Da habe ich mich wohl etwas auf das berechnen von Exponenten fixiert, anstatt auch mal den Rest zu betrachten
-
cjmischka schrieb:
Danke erst mal für den POW Tip
jetzt hab ich das mal eben gemacht nur das die rechnung ein Falsches ergebinss bringt. Und zwar pro eingabewert sind 48 zu viel.Könnte daran liegen, das '0' den ASCII-Wert 48 hat.
Probier mal:loes= loes + ((dual[i]-'0') * pow(2,i));
oder besser:
loes= loes + ((dual[i]-'0') * (1<<i));
Ist es eigentlich von dir beabsichtigt, das man entgegen der
üblichen Konvention die niedrigste Ziffer zuerst eingeben muß?Ansonsten solltest du schreiben:
#include <iostream.h> #include <math.h> int main(){ char dual[20]; int i; double loes; loes = 0; i=0; cout<< "Gib deine Dualzahl ein:"; cin >> dual; while(dual[i]!='\0'){ loes+= dual[i] -'0'; loes *=2; i++; } cout << "Deine dez Zahl ist:" << loes; return(0); }
-
loes*=2 funktioniert nicht, da es das gesamte bisherige Ergebnis mit 2 multipliziert, wir wollen aber nur die 2er Potenz ausrechnen um sie im nächsten durchlauf, falls noch einer kommt, darauf addieren zu können.
48 oder '0' von dem char wert abziehen ist klar.
Stellt sich mir nur noch die Frage wiso loes ein double ist.
-
Entyl_Sa schrieb:
loes*=2 funktioniert nicht, da es das gesamte bisherige Ergebnis mit 2 multipliziert, wir wollen aber nur die 2er Potenz ausrechnen um sie im nächsten durchlauf, falls noch einer kommt, darauf addieren zu können.
48 oder '0' von dem char wert abziehen ist klar.doch, das klappt. ich rechne mal 1101 aus.
0 *2 +1 ==1 1 *2 +1 ==3 3 *2 +0 ==6 6 *2 +1 ==13 ^ | hier kam die binärzahl ziffernweise rein
-
An der Stelle an der luser es geschrieben hat funktioniert es allerdings nicht.
Sonst hast du zwar recht, nur das du so die Binärzahl in genau umgekehrter Reihenfolge wie _cjmischka_ auswertest. Darüber welche Reihnfolge eigentlich gewollt ist werden wir wohl nicht mehr aufgeklärt werden