Hallo zusammen, habe eben an einer Funktion in C gesucht, um Zehnerpotenzen zu erzeugen. Also ein Variable hat den Wert 3, dann möchte ich 1000 erhalten, bei 4 dann 10000 u.s.w. Leider hat 10^Varriable nicht funktioniert. Nach dem nachlesen in einem C-Buch habe ich gesehen, das ^ bitweise exklusivoder ist. Habe das Problem jetzt aufwendig in einer Schleife gelöst. Frage: Gibt es in C wirklich keine Potenzen ? Gruß Dirk
Funktioniert das auch mit Variablen? also 10ei? i ist hier die Variable. Ich würde her zu pow() auf der math.h tendieren! [EDIT]Ach, das die leute immer Editieren müssen, während ich schriebe...
Timmo H. schrieb: > Bei Konstanten macht es aber keinen Sinn, da so unnützer weise eine > Funktion zum berechnen aufgerufen wird. In einer Hosted-Environment (was man ja eigentlich immer hat) wohl kaum. Da ersetzt der Compiler auch so etwas durch Konstanten.
Wenn es nur um Integer geht ist pow() allerdings ziemlicher Overkill. Dann würde ich lieber selber eine Funktion schreiben:
1 | uint32_t exp10(uint8_t e) |
2 | {
|
3 | uint32_t x = 1; |
4 | for (uint8_t i = 0; i < e; i++) { |
5 | x = x * 10; |
6 | }
|
7 | return x; |
8 | }
|
Oder wenn es universeller sein soll:
1 | int32_t pow_int32(int32_t base, uint8_t exp) |
2 | {
|
3 | int32_t x = 1; |
4 | for (uint8_t i = 0; i < exp; i++) { |
5 | x = x * base; |
6 | }
|
7 | return x; |
8 | }
|
Hallo, ich mache das manchmal so, dass ich ein Array im Flash anlegen. Bedingung n E [0,..,9], f(n) = 10^n
1 | #include <avr/pgmspace.h> |
2 | |
3 | const uint32_t const a_my_exp10 [] PROGMEM = |
4 | {
|
5 | 1ul, // 10^0 |
6 | 10ul, // 10^1 |
7 | 100ul, // 10^2 |
8 | 1000ul, // 10^3 |
9 | 10000ul, // 10^4 |
10 | 100000ul, // 10^5 |
11 | 1000000ul, // 10^6 |
12 | 10000000ul, // 10^7 |
13 | 100000000ul, // 10^8 |
14 | 1000000000ul, // 10^9 |
15 | };
|
16 | |
17 | uint32_t get_exp10(uint8_t n) |
18 | {
|
19 | if (n < 10) |
20 | return (uint32_t)pgm_read_dword( & a_my_exp10[ n ] ); |
21 | else
|
22 | return 0; |
23 | }
|
10e3 ist vom Typ float, also Vorsicht. 1000 ist nicht gleich 10e3. Auch pow ist für Fließkommazahlen. Wenn man tatsächlich Integer will, muss man sich also was anderes überlegen. Wenn's eh floats sein sollen, ist pow die richtige Wahl. Grüße, Sven
Für die paar ganzzahligen Zehnerpotenzen, deren Ergebnis auch wieder in einen int passt, lohnt sich da nix großartiges. Nimm ein Array, indziert mit der Potenz die du brauchst und gut ists.
Hallo, danke für die zahlreichen Antworten (hätte ich gar nicht mit gerechnet) Der Hinweis mit dem Array ist super, mache ich dann so. Thema beendet. Gruß Dirk
Sven B. schrieb: > 10e3 ist vom Typ float, also Vorsicht. 1000 ist nicht gleich 10e3. 10³ = 1000. 10e3 = 1e4 = 10 * 1000 = 1 * 10000. Ich dachte soviel Mathe kann man hier voraussetzen. Aber ich werde es dem nächst berücksichtigen.
Karl schrieb: > Sven B. schrieb: >> 10e3 ist vom Typ float, also Vorsicht. 1000 ist nicht gleich 10e3. > > 10³ = 1000. 10e3 = 1e4 = 10 * 1000 = 1 * 10000. Ich dachte soviel Mathe > kann man hier voraussetzen. Aber ich werde es dem nächst > berücksichtigen. Selfowned^^
Karl schrieb: > Sven B. schrieb: >> 10e3 ist vom Typ float, also Vorsicht. 1000 ist nicht gleich 10e3. > > 10³ = 1000. 10e3 = 1e4 = 10 * 1000 = 1 * 10000. Ich dachte soviel Mathe > kann man hier voraussetzen. Aber ich werde es dem nächst > berücksichtigen. Er meinte das die beiden Zuweisungen
1 | A = 1000; |
2 | B = 1E3; |
nicht gleich sind. Und das sind sie auch nicht, da der Datentyp unterschiedlich ist.
Karl schrieb: > 10³ = 1000. 10e3 = 1e4 = 10 * 1000 = 1 * 10000. Ich dachte soviel Mathe > kann man hier voraussetzen. Aber ich werde es dem nächst > berücksichtigen. Meine Aussage stimmt trotzdem. ;)
Sven B. schrieb: > 1000 ist nicht gleich 10e3 Sven B. schrieb: > Meine Aussage stimmt trotzdem. ;) Aber verwirrend.
Garl schrieb: > Aber verwirrend. Ja stimmt, ich hab' mich auch tatsächlich verschrieben. Aber wenn man schon kleinkariert sein muss, dann sollte man wenigstens echte Fehler angreifen! ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.