Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Power funktioniert nicht wie gedacht (https://www.delphipraxis.net/197254-power-funktioniert-nicht-wie-gedacht.html)

gammatester 24. Jul 2018 19:55

AW: Power funktioniert nicht wie gedacht
 
Zitat:

Zitat von DieDolly (Beitrag 1408530)
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.

DieDolly 24. Jul 2018 19:57

AW: Power funktioniert nicht wie gedacht
 
Ich bin mir unsicher aber ich glaube
Delphi-Quellcode:
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.

gammatester 24. Jul 2018 20:08

AW: Power funktioniert nicht wie gedacht
 
Zitat:

Zitat von DieDolly (Beitrag 1408532)
Ich bin mir unsicher aber ich glaube
Delphi-Quellcode:
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.

DeddyH 24. Jul 2018 20:10

AW: Power funktioniert nicht wie gedacht
 
Naja, grob überschlagen müsste 1024^7 eine Zahl mit 21 Stellen ergeben, das ist schon mächtig groß.

DieDolly 24. Jul 2018 20:27

AW: Power funktioniert nicht wie gedacht
 
Würde ein Hardcast auf Int64 die Zahl verkleinern und keinen Fehler mehr erzeugen?

Schematisch
Delphi-Quellcode:
I := Int64(1024^7);

Michael II 24. Jul 2018 20:51

AW: Power funktioniert nicht wie gedacht
 
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 ;-).

gammatester 24. Jul 2018 20:58

AW: Power funktioniert nicht wie gedacht
 
Zitat:

Zitat von DieDolly (Beitrag 1408535)
Würde ein Hardcast auf Int64 die Zahl verkleinern und keinen Fehler mehr erzeugen?

Schematisch
Delphi-Quellcode:
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

Daniel 24. Jul 2018 21:01

AW: Power funktioniert nicht wie gedacht
 
Wenn du bereit bist, die Zahl künstlich durch ein Typecast zu verringern, welche qualitativen Ansprüche stellst du denn an die in deinem ersten Beitrag erwähnte Umrechnung? Das widerspricht sich doch…

p80286 24. Jul 2018 21:19

AW: Power funktioniert nicht wie gedacht
 
Naja, Ihm fehlte in dem Moment die Erinnerung an das Rechnen mit Potenzen.
Kann schon mal vorkommen.

gruß
K-H

DieDolly 24. Jul 2018 21:33

AW: Power funktioniert nicht wie gedacht
 
Vielleicht helfe ich euch und auch mir, wenn ich mein Problem erkläre.
Ich habe ein TEdit sowie eine TComboBox. Im Edit kann ich eine Zahl eingeben und in der ComboBox kann ich von Byte bis Gigabyte alles auswählen.
Die eingegebene Zahl soll später in das umgerechnet werden, was ich in der ComboBox ausgewählt habe. Das schaffe ich. Aber wie außer mit try except fange ich Fehleingaben ab, sodass die Zahl niemals größer wird als 1099511627775 Bytes (1TB-1Byte)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz