Exponenten mit C++ berechen
-
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
-
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.
Ich benutze das Horner-Schema
Entyl_Sa schrieb:
Stellt sich mir nur noch die Frage wiso loes ein double ist.
Sollte natuerlich int sein. Ich habe beim Kopieren vergessen,
es umzuaendern.Entyl_Sa schrieb:
An der Stelle an der luser es geschrieben hat funktioniert es allerdings nicht.
Mir ist doch tatsaechlich ein Fehler unterlaufen. Die berechnete
Zahl ist offensichtlich doppelt so gross, wie sie seien sollte.
loes muss zum Schluss noch durch 2 geteilt werden.
oder aber:... while(dual[i]!='\0'){ loes *=2; loes+= dual[i] -'0'; i++; } ...