Programmieren C komische Zahl kommt raus?


08.11.2022, 09:49

das ist die funktion bie 10^7 kommts richitge raus bei 10^10 kommt das da unten raus:

hier:


08.11.2022, 09:49
/******************************************************************************


                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.


*******************************************************************************/


#include <stdio.h>
 int power( int a, int n ) {
      if (n<=0) { a=1/a; n=-n; }
      int p= 1;
      while(n) {
          if (n&1) p*= a;
          n>>= 1;
      a*= a;
      }
      return p;
}


int main()
{
    printf("Hello World %d ", power(10,10));


    return 0;
}



08.11.2022, 09:50

potenzcode ist nicht von mir sondern ovn der website

https://www.stacklounge.de/4900/potenzfunktion-in-c-selbst-schreiben


08.11.2022, 09:54

ja lag am datentyp, danke hab mit long gemacht dann funktionierts

KuarThePirat  08.11.2022, 09:45

Magst Du den Code vielleicht noch posten? Idealerweise auf einer passenden Webseite dafür.

Irrwegnutzer 
Fragesteller
 08.11.2022, 09:49

jo hab ich

4 Antworten

Wenn ein int 32 Bit breit ist, dann ist 10^10 viel zu groß.

Außerdem: Was soll denn a = 1/a berechnen, wenn a ein int ist?

Ich schätze wie Suboptimierer, dass du einen falschen Datentyp nimmst.

Beispiel: Nutzt du ein "unsigned char" (8 bit, 0-255) und rechnest 250 + 60, dann erhältst du als Ergebnis 55, denn du hast den maximalen Wertebereich überschritten.

Wenn Speicherplatz erstmal keine Rolle spielt, nimm einen 64 bit Wert (long long), damit hast du erstmal keine Probleme mit Überläufen.

Woher ich das weiß:Studium / Ausbildung – Masterstudium Elektrotechnik - Schwerpunkt Embedded Systems

"int" ist halt vom Wertebereich limitiert - nimm einen "long long", dann klappt's auch noch mit 10^10.

Woher ich das weiß:Berufserfahrung – Langjährige Berufserfahrung als IT-Berater

Möglicherweise arbeitest du mit einem Datentyp, für den diese Zahl zu groß ist, um sie korrekt darzustellen.

Woher ich das weiß:Berufserfahrung – Programmierer
Irrwegnutzer 
Fragesteller
 08.11.2022, 09:45

arbeite mit int, was könnte ich nehmen? hab nur ganzahlige werte geht dann double auch ?

0
Suboptimierer  08.11.2022, 09:47
@Irrwegnutzer

Rein theoretisch kommst du mit Double zu nicht so großen Zahlen, weil die Lücken zwischen Ganzen Zahlen gefüllt werden müssen.

Schau mal besser, ob es long int oder big int oder so gibt oder im Netz, ob es Containerlösungen gibt. Dabei wird dynamisch Speicher reserviert und miteinander verkettet, sollte er nicht ausreichen. Doppelt so weit könntest du mit unsigned int kommen, falls du keine negativen Zahlen brauchst.

1
R4c1ngCube  08.11.2022, 10:06
@Suboptimierer

Das stimmt so glaube ich nicht ganz (zumindest nicht wenn c wie ich vermute dem IEEE Standard folgt)

Double kann deutlich größere Werte annehmen, als ein Integer. Der maximale Wert ist laut Wikipedia 1,8·10308

Der Grund warum man Double nicht verwenden sollte ist, dass er für große Werte immer ungenauer wird, weil eben nicht alle Werte dazwischen gefüllt werden.

0
Suboptimierer  08.11.2022, 10:12
@R4c1ngCube

Double ist dafür gedacht, Dezimalzahlen aufzunehmen. Die Verteilung der Zahlen ist um 0 herum am dichtesten, denn auch Nachkommazahlen können selbstverständlich nicht beliebig genau dargestellt werden.

Du hast recht. Vielleicht kommt Double höher, aber was bringt das schon? Man kann sehr leicht einen Datentyp erfinden, der nur 0, 1 und 10^9999 aufnehmen kann. Wenn man dann den Range angibt, könnte man sagen, es ließen sich Zahlen von 0 bis 10^9999 darstellen 😅

Die Anzahl an Zahlen ist entscheidend und die dürfte bei Double nicht viel höher sein. Habe mich etwas undeutlich ausgedrückt.

0