Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Mr. Schmidt

Frischling

  • »Mr. Schmidt« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Nürnberg

  • Private Nachricht senden

1

17.09.2006, 13:19

Potenzieren

Hallo alle zusammen,

ich muss für ein Programm die Rechnung 2 ^ 32 ausrechnen und hab im Internet dafür die Funktion pow (Basis, Exponent) gefunden. Die funktioniert auch ohne weiteres aber nur in der Debug Version. Sobald ich in die Release Version wechsel, wird die Potenz nicht mehr ausgerechnet und das Ergebnis ist 0.

Hier ist der Code Ausschnitt, vielleicht findet ihr den Fehler:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#include <math.h>

double Basis = 2.0;
double Exponent = 32.0;
double Potenz = 0.0;
Potenz = pow(Basis, Exponent);

TempZahl = ((69069*TempZahl+1) % static_cast<int>(Potenz));


Vielen Dank schonmal für eure Hilfe

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

17.09.2006, 13:42

Was ist "TempZahl"?
Was für einen Sinn hat das überhaupt?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

17.09.2006, 13:46

2^32 = 4294967296 ;)

ja, die frage nach dem sinn is eine gute ^^

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

17.09.2006, 13:51

2^32 ist auf jeden Fall zu groß für int, da muss er schon __int64 (in VC++) nehmen.

Mr. Schmidt

Frischling

  • »Mr. Schmidt« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Nürnberg

  • Private Nachricht senden

5

17.09.2006, 17:32

Hallo,

TempZahl wird im weiteren Verlauf des Programmes verwendet, es handelt sich hier ja nur um einen Codeausschnitt.
Der Sinn davon ist, dass ich nicht verstehe warum es in der Debug Version funktioniert, in der Release Version allerdings nicht.
Die Potenz ausrechnen kann ich schon auch mit nem normalen Rechner, allerdings ist das nicht der Sinn des Programms, es soll nämlich im Code relativ einfach zu ändern sein. Und die Basis und den Exponent ändert man schneller als das Ergbniss. Vorallem wenn schon so eine Funktion vorhanden ist, kann man davon ja auch Nutzen machen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

17.09.2006, 20:46

Das Ergebnis ist definitiv zu groß für einen 32-Bit-Integer (und int hat meist 32 Bits). Ich rate dir davon ab, pow zu benutzen. Möglich, dass es bei solch großen Zahlen ungenau wird, und da es ja sowieso eine ganze Zahl ist, ist es unsinnig, mit double zu rechnen.

Wenn du 2^x als Integer berechnen willst, geht das mit einfachem Bit-Shifting viel effizienter:

1 << x

Mehr braucht's nicht.

Mr. Schmidt

Frischling

  • »Mr. Schmidt« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Nürnberg

  • Private Nachricht senden

7

17.09.2006, 23:16

Ah wunderbar, vielen Dank das hat mir sehr weitergeholfen. Kannte dieses Bit Shiftig bis jetzt noch nicht, aber das werde ich mir merken.
Jetzt kann ich wieder weiterprogrammieren bis der nächste Fehler kommt ;) .

Schönen Abend dann noch!

8

22.09.2006, 23:33

Och, wieso flaot und double sind für sowas doch prima.
ihc meine, 2^32 müssten die odhc 100% genau fassen können, IMHO speicher die shcließlich nur Zweierpotenzen. Also, statt 1,5234634636*10^12 halt mit *2^12.
Dann wird das zu 1*2^32 und steht da super.
Nur wenn man jetzt -1 oder so rechnet wirds schlecht, das wird ein float wohl kaum packen.
Ist jetzt nur ncoh die Frage, wo man soclhe genauigkeiten benötigt. Muss schon was sehr extremes sein, und vielleicht kann man das irgendwie umgehen oder einfach double nehemn.
Wenn das noch nciht reicht nimmt man halt irgendne lib die extrem genaue zahlen darstellen kann, aber das braucht man doch fast nie.
Lieber dumm fragen, als dumm bleiben!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

23.09.2006, 02:21

float zu nutzen wäre wenig sinnreich, weil die 32 bit eines float wie folgt genutzt werden:
Vorzeichenbit, 8-Bit-Exponent, 23-Bit-Mantisse
Da die Mantisse begrenzt auf 8388608 ist, muss man zwangsläufig Ungenauigkeiten hinnehmen. Da ist es doch geschickter einen Ganzzahlentyp zu nutzen bei dem man z.b. eine Mantisse von 31bit bei gleicher Datenmenge(32bit) hat.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige