Nirn.de

Gast

Thema: Hausaufgabenhilfe-Thread  (Gelesen 121320 mal)

  • Hexer
    • Magiergilde
Wenn ich dich richtig verstehe, hast du einfach eine Ebene:
a x + b y + c z = d .
Das erste hast du ja gemacht. Dann kannst du ja einfach anhand der Koordinaten der vier Punkte pi = (ai,bi,ci)t überprüfen, ob für die obere Gleichung etwas größeres oder kleineres als d heraus kommt. Der Ursprung ist ja p0 = (0,0,0)t, also kannst du wiederum bei ihm gucken, auf welcher Seite er ist und dann solltest du eigentlich fertig sein?
« Letzte Änderung: 12.02.2014, 16:21 von Orwan »
1. Die Null finden.
2. Die Eins kompliziert schreiben.
3. Taylorentwickeln.
  12.02.2014, 16:17
  • Offline
  • http://orwan-hull.deviantart.com


  • Skelett-Magier
    • Untot
Jo. So war es. Ich hatte mir die Aufgabe falsch notiert und war von der "Ursprungsgeraden" irritiert. Natürlich sollten wir nur den Ursprung überprüfen.
  13.02.2014, 16:01
  • Offline


  • Schildknappe
    • Legion
Kennt sich hier jemand mit C, bzw. C++ und der Ausgabe von Datentypen genauer aus?

Ich habe heute eine Aufgabe bekommen, in welcher man mit einem Programm die 2er Potenzen bis 2 hoch 36 ausgeben sollte.

Hört sich erst mal ganz einfach an, aber dabei tritt ein Problem auf:

Das ist mein Programm:

Code
#include <iostream>
using namespace std;

int main(){

int n=1;
int a=1;
  do{
   
    cout<<a<<". "<< n << endl;
    n=n*2;
   
    a++;
   
    }while(a<=35);

return 0;

}

Die Ausgabe stimmt genau bis zur 31. Zeile, dann werden ihm die Zahlen anscheinend zu groß..
Hab schon versucht, "n" als "long"-Datentyp zu deklarieren, aber die Ausgabe bleibt die Gleiche. Meine Vermutung ist also, dass das ganze an der "cout"-Methode scheitert. Was kann ich machen, um größere zahlen korrekt auszugeben?

Hier die Ausgabe
Code
1. 1
2. 2
3. 4
4. 8
5. 16
6. 32
7. 64
8. 128
9. 256
10. 512
11. 1024
12. 2048
13. 4096
14. 8192
15. 16384
16. 32768
17. 65536
18. 131072
19. 262144
20. 524288
21. 1048576
22. 2097152
23. 4194304
24. 8388608
25. 16777216
26. 33554432
27. 67108864
28. 134217728
29. 268435456
30. 536870912
31. 1073741824
32. -2147483648
33. 0
34. 0
35. 0

           "Go ye now in peace. Let thy fate be written in the Elder Scrolls..."
  12.04.2014, 00:03
  • Offline


  • Drachenhüter
    • Nirn.de Team
int und long sind wahrscheinlich beide 32 bit groß. Was du hier beobachtest, dürfte ein overflow deines Integers sein. In Schritt 31 ist sein Wert 0100...0000, du verdoppelst es auf 1000...0000. Dein int ist allerdings vorzeichenbehaftet und das höchste Bit ist nun 1, du bist also im negativen Bereich.

Testen könntest du das, indem du entweder ein unsigned int verwendest (das sollte den 32. Schritt noch schaffen) oder eine Abbruchbedingung für a<0 in deine Schleife packst. Für alles weitere brauchst du dann ein ausreichend langes integer, "long long" gibt's da, glaube ich.
Die größten Kritiker der Molche
waren früher eben solche
  12.04.2014, 09:57
  • Offline


  • Schildknappe
    • Legion
Hat funktioniert :)
Zeile 6 muss also lauten:

Code
long long n=1LL;
Das "LL" hab ich drangehängt, weil ich beim Suchen nach dem "long long"-Datentyp gelesen habe, dass c++ standardmäßig "long long" gar nicht erkennt, wenn es nur auf der linken Seite steht. Es funktioniert alerdings trotzdem, wenn man das LL weglässt.

Gut zu wissen, warum sich auf einmal das Vorzeichen ändert.
Danke für die Info.
  12.04.2014, 12:20
  • Offline