Forum: Mikrocontroller und Digitale Elektronik Zehnerpotenzen in C: z.B 10^3 = 100


von Dirk F (Gast)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

pow (math.h)

Konstanten kannst du auch so schreiben: 10e3

von Chris L. (kingkernel)


Lesenswert?

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...

von Timmo H. (masterfx)


Lesenswert?

10E geht nur mit konstanten. Ansonsten bleibt dir nur pow

von Stefan E. (sternst)


Lesenswert?

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.

von Timmo H. (masterfx)


Lesenswert?

Ja stimmt, darum habe ich es auch wieder wegeditiert

von Fabian O. (xfr)


Lesenswert?

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
}

von Eumel (Gast)


Lesenswert?

10^3 ist übrigens nicht 100 ;)

von Fabian O. (xfr)


Lesenswert?

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
}

von Dirk (Gast)


Lesenswert?

Äh, Sorry  1^3  = 100

von Eumel (Gast)


Lesenswert?

Dirk schrieb:
> Äh, Sorry  1^3  = 100

Ne, das ist 1 ;)

von Uwe (de0508)


Lesenswert?

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
}

von Sven B. (scummos)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dirk F (Gast)


Lesenswert?

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

von Chris L. (kingkernel)


Lesenswert?

pow und 10e3 sind float? gut zu wissen!!

von Karl (Gast)


Lesenswert?

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.

von Lool (Gast)


Lesenswert?

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^^

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von Sven B. (scummos)


Lesenswert?

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. ;)

von Garl (Gast)


Lesenswert?

Sven B. schrieb:
> 1000 ist nicht gleich 10e3

Sven B. schrieb:
> Meine Aussage stimmt trotzdem. ;)

Aber verwirrend.

von Stefan (Gast)


Lesenswert?

Für Fließkommazahlen lautet die gesuchte Funktion pow(x,y).

von Sven B. (scummos)


Lesenswert?

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
Noch kein Account? Hier anmelden.