AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Power funktioniert nicht wie gedacht

Ein Thema von DieDolly · begonnen am 24. Jul 2018 · letzter Beitrag vom 25. Jul 2018
Antwort Antwort
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#1

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 19:45
Wenn ich Doubvle verwende bekomme ich an anderen Stellen Probleme wo ich Integer-Variablen verwende.

Was ist denn hiermit?
I := Round(Power(1024, 3));
Das Ergebnis ist zu groß für integer. Gibt 0 weil Overflow für 32-Bit-Integer.
Delphi-Quellcode:
var I: Int64;
I := Round(Power(1024, 3));
geht aber.

Geändert von gammatester (24. Jul 2018 um 19:48 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 19:49
Funktioniert sehr gut. Mit Int64 sollte ich eigentlich keine Grenzen sprengen können.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#3

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 19:55
Funktioniert sehr gut. Mit Int64 sollte ich eigentlich keine Grenzen sprengen können.
Sorry, integer funktioniert knapp auch (benutzt 30 der 31 Bits). Habe mit 4096 getestet. Aber int64 ist sicherer.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#4

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 19:57
Ich bin mir unsicher aber ich glaube I := Round(System.Math.Power(1024, 7)) funktioniert nicht, selbst wenn I Int64 ist.
Der Fehler lautet
Zitat:
Exception der Klasse $C0000090 mit der Meldung 'floating point invalid operation at 0x004075ff' aufgetreten.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#5

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 20:08
Ich bin mir unsicher aber ich glaube I := Round(System.Math.Power(1024, 7)) funktioniert nicht, selbst wenn I Int64 ist.
Der Fehler lautet
Zitat:
Exception der Klasse $C0000090 mit der Meldung 'floating point invalid operation at 0x004075ff' aufgetreten.
Richtig. 1024=2^10 also 1024^7 = 2^70 und das maximale int64 is 2^63-1. Hier wirst Du nicht um Fließkomma herumkommen, am besten Double.

Geändert von gammatester (24. Jul 2018 um 20:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#6

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 20:10
Naja, grob überschlagen müsste 1024^7 eine Zahl mit 21 Stellen ergeben, das ist schon mächtig groß.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#7

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 20:27
Würde ein Hardcast auf Int64 die Zahl verkleinern und keinen Fehler mehr erzeugen?

Schematisch
I := Int64(1024^7);
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
778 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 20:51
Nützt nix. Wie bereits weiter oben erwähnt werden Werte vom Typ int64 in 64 Bits gespeichert.

1024(10) = 10000000000(2) (eine 1 mit 10 Nullen)
1024^2(10) = 100000000000000000000(2) (eine 1 mit 20 Nullen)
1024^3(10) = 1000000000000000000000000000000(2) (eine 1 mit 30 Nullen)
...
1024^7(10) ergibt binär eine 1 mit 70 Nullen, also eine 71 stellige binäre Zahl.

ABER: Die grösste positive Zahl, welche du mit einem int64 speichern kannst ist 63 stellig:
1111...….11111(2) (63 1er) = 2^63-1 (10).

D.h. : Du kannst die 1024^7 nicht in einen int64 quetschen .
Michael Gasser
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

AW: Power funktioniert nicht wie gedacht

  Alt 24. Jul 2018, 20:58
Würde ein Hardcast auf Int64 die Zahl verkleinern und keinen Fehler mehr erzeugen?

Schematisch
I := Int64(1024^7);
1024^7 ist als Operation nicht definiert. power(1024,7) Fließkomma und ein Hardcast nicht erlaubt. Es bleiben zwei unsinnige Konstruktionen
Delphi-Quellcode:
uses system.math;
var
  x: double;
  I: int64 absolute x;
begin
  x := power(double(1024),7);
  writeln('I absolute: ', I);
  {$r-,q-}
  I := 1024*1024*1024;
  I := I*1024*1024;
  I := I*1024*1024;
  writeln('I als Produkt ', I);
end.
Das ergibt dann die falschen Werte
Code:
I absolute: 4922434392715952128
I als Produkt 0
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz