Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   ungerade und gerade Zahlen erkennen (https://www.delphipraxis.net/200773-ungerade-und-gerade-zahlen-erkennen.html)

Neutral General 24. Mai 2019 10:28

AW: ungerade und gerade Zahlen erkennen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von mensch72 (Beitrag 1433036)
etwas Hardcore:
in der binären Darstellung einer ganzen Zahl ist das niederwertigste Bit=0

Delphi-Quellcode:
if (zahl and 1) = 0 then
  ShowMessage('Zahl ist gerade')
else
  ShowMessage('Zahl ist ungerade');
(das überfordert aber teils schon manche Lehrer... )

Es kann nicht schaden das zu wissen, aber der Compiler optimiert das sogar selbst:
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
var zahl: Integer;
begin
  zahl := 3;
  if zahl mod 2 = 0 then
    ShowMessage('!');
end;
CPU-Fenster zur Laufzeit:

https://www.delphipraxis.net/attachm...1&d=1558690075

Moombas 24. Mai 2019 10:34

AW: ungerade und gerade Zahlen erkennen
 
Zitat:

Zitat von Neutral General (Beitrag 1433034)
Deine Gerade/Ungerade Prüfung ist falsch rum. "Odd" bedeuted "Ungerade".

Es wurde zwar schon angedeutet, aber was dein Lehrer wahrscheinlich statt der Funktion Odd() haben wollte ist wahrscheinlich was anderes.
Eine Zahl ist gerade wenn sie ohne Rest durch 2 teilbar ist. In Delphi gibt es den "mod" Operator mit dem du den Rest einer Division erhältst.
D.h. eine andere Art zu prüfen wäre:
Delphi-Quellcode:
if (zahl mod 2) = 0 then // Falls der Rest der Division von der Zahl geteilt durch zwei 0 ist, ist die Zahl gerade
  ShowMessage('Zahl ist gerade')
else
  ShowMessage('Zahl ist ungerade');

Oops, danke für den Hinweis. Wollte natürlich nix falsches Erzählen und hab es geändert. Ist passiert, da ich die Prüfung vorher andersrum hatte^^

Dein Ansatz war ursprünglich auch meiner, wobei ich denke das die Funktion Odd() ähnlich vorgeht. Aber beides sind Wege das richtige Ergebnis zu erhalten. "Viele Wege führen nach Rom" :)

Uwe Raabe 24. Mai 2019 11:35

AW: ungerade und gerade Zahlen erkennen
 
Odd ist allerdings immer noch die schnellste Option.

Bei Odd gibt es lediglich einen TEST call auf das Lo-Byte und einen bedingten Sprung:
Code:
Project543.dpr.9: if Odd(N) then
0040A10A F60588F5400001   test byte ptr [$0040f588],$01
0040A111 741B            jz $0040a12e
während der Weg über mod schon ein paar mehr CPU-Befehle braucht:
Code:
Project543.dpr.13: if N mod 2 = 0 then
0040A147 A188F54000       mov eax,[$0040f588]
0040A14C 2501000080       and eax,$80000001
0040A151 7905             jns $0040a158
0040A153 48               dec eax
0040A154 83C8FE          or eax,-$02
0040A157 40               inc eax
0040A158 85C0             test eax,eax
0040A15A 751B            jnz $0040a177

Rollo62 24. Mai 2019 12:13

AW: ungerade und gerade Zahlen erkennen
 
Wenn die Rede von floating point ist, könnte das hier sinnvoll sein.
Das ist wohl nicht die effizienteste Lösung, und ich würde das anders machen.

Ich halte das Ganze aber sowieso für ziemlich fragwürdig, wahrscheinlich gibt es hier ein Missverständnis was odd/even sein soll bei floating point.

Womöglich sollte die Variable in deinem Programm auf Integer geändert werden.

Es kommt auch auf die Anzahl der relevanten Nachkommastellen, z.B. wenn 0.001 reicht dann könntest du Alles mal 1000 nehmen, und zu Integer wechseln.

Neutral General 24. Mai 2019 12:19

AW: ungerade und gerade Zahlen erkennen
 
Du hast Recht.
Bei dem mod unterscheidet er noch zwischen positiven und negativen Zahlen. Obwohl das in dem Fall eigentlich nicht notwendig wäre.
Hätte ich nicht gedacht.

ISMIRSCHLECHT 11. Jun 2019 08:23

AW: ungerade und gerade Zahlen erkennen
 
Statt Hardcoreprogrammierung etwas Mathematik :
Nur bei ganzen Zahlen ist die Eigenschaft "gerade" (entspr. "ungerade) definiert.
Niemals bei gebrochenen oder reellen Zahlen.

ism


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Seite 2 von 2     12   

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