[delphi] Bepaling of getal decimalen heeft.

Pagina: 1
Acties:

  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 09-04 15:06

FvH

Aan het typen...

Topicstarter
Heb het volgende probleem.

Moet testen of getal i een macht van 2 is.

nu dacht ik (i wordt aan functie meegegeven)

code:
1
2
3
4
5
6
7
8
9
10
var
  x: extended;
begin
  x := log2(i);
  if ((x mod 2) = 0) then
       // Getal is een macht van 2.
  else
      // Getal is geen macht van 2.
   end if;
end;


het probleem is echter dat er uit log2(i) een extended komt en dat die niet met de modulo (MOD) gebruikt mag worden.

Type casten naar integer of int64 mag niet.

Heeft iemand een oplossing??

What are clouds made of? Linux servers mostly!


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 31-08 21:58

Delphi32

Heading for the gates of Eden

Wat dacht je van
code:
1
2
3
4
5
6
7
8
9
10
if x = Round(x) then begin
  if ((x mod 2) = 0) then begin
  //getal is macht van 2
  end 
  else begin
  //getal is geen macht van 2
end
else begin
  //getal heeft cijfers achter de komma dus zeker geen macht van 2
end;


Dat kan natuurlijk korter als je Complete Boolean Evaluation uit hebt staan, want dan kun je doen:
code:
1
2
3
4
5
6
if (x = Round(x)) and ((x mod 2) = 0) then begin
//een macht van 2
end
else begin
//geen macht van 2
end;

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:40

Knutselsmurf

LED's make things better

Delphi32 schreef op 20 september 2002 @ 23:48:
Wat dacht je van
code:
1
2
3
4
5
6
7
8
9
10
if x = Round(x) then begin
  if ((x mod 2) = 0) then begin
  //getal is macht van 2
  end 
  else begin
  //getal is geen macht van 2
end
else begin
  //getal heeft cijfers achter de komma dus zeker geen macht van 2
end;


Dat kan natuurlijk korter als je Complete Boolean Evaluation uit hebt staan, want dan kun je doen:
code:
1
2
3
4
5
6
if (x = Round(x)) and ((x mod 2) = 0) then begin
//een macht van 2
end
else begin
//geen macht van 2
end;
Klopt niet. Wat jij nu aangeeft, is of een getal deelbaar is door 2 of niet. De oorspronkelijke oplossing, met de log2(x) is zeker correct. Ik weet niet uit mijn hoofd wat deze teruggeeft, maar er zijn zeker mogelijkheden om te controleren of dit een geheel getal is. Een mogelijke oplossing: trunc/round(log2(x)=log2(x)

- This line is intentionally left blank -


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 21:18

Tomatoman

Fulltime prutser

Als precies één bit de waarde 1 heeft en alle andere bits 0 zijn, is het getal een macht van twee. Je kunt testen of dit het geval is:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function IsPowerOfTwo(Value: Integer): Boolean;
asm
    ADD     Value,0      // flags instellen aan de hand van Value
    JNG     @@false      // als Value <= 0, springen naar @@false
@@compare:
    BSR     ECX,Value    // positie van least significant bit met waarde 1
    BSF     EDX,Value    // positie van least significant bit met waarde 1
    MOV     EAX,1        // EAX := 1 (defaultwaarde True instellen)
    CMP     ECX,EDX      // posities gelijk?
    JZ      @@end        // zo ja, naar @@end
@@false:
    MOV     EAX,0        // EAX := 0 (oftewel Result := False)
@@end:
end;

Een goede grap mag vrienden kosten.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Frac, Trunc of Round maken van een float een int.

Je zou kunnen kijken of een float een geheel getal is door te kijken of Frac van het getal 0 is.

We adore chaos because we like to restore order - M.C. Escher


  • Paul
  • Registratie: September 2000
  • Laatst online: 17:21
tomatoman schreef op 21 september 2002 @ 04:03:
Als precies één bit de waarde 1 heeft en alle andere bits 0 zijn, is het getal een macht van twee. Je kunt testen of dit het geval is:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function IsPowerOfTwo(Value: Integer): Boolean;
asm
    ADD     Value,0      // flags instellen aan de hand van Value
    JNG     @@false      // als Value <= 0, springen naar @@false
@@compare:
    BSR     ECX,Value    // positie van least significant bit met waarde 1
    BSF     EDX,Value    // positie van least significant bit met waarde 1
    MOV     EAX,1        // EAX := 1 (defaultwaarde True instellen)
    CMP     ECX,EDX      // posities gelijk?
    JZ      @@end        // zo ja, naar @@end
@@false:
    MOV     EAX,0        // EAX := 0 (oftewel Result := False)
@@end:
end;
Ik neem aan dat je een typo hebt gemaakt in je commentaar? Inhoudelijk kan ik er niet op ingaan (ken geen ASM), maar er staat nu 2x least significant bit...

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Is niet het makkelijkt om de decimaal met een FloatToStrF functie in een String te gooien, en te kijken of er alleen maar nullen achter de komma staan ?

Mother, will they like this song?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

no offense, maar er zijn al tig werkende oplossing gegeven, en die met die FloatToStr lijkt me het aller aller minst aantrekkelijke :)

We adore chaos because we like to restore order - M.C. Escher


  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 09-04 15:06

FvH

Aan het typen...

Topicstarter
Bedankt!! Die ASM variant lijkt het snelst te werken ;) Heb hem iets aangepast zodat ik hem ook voor wat anders kan gebruiken, maar tomatoman!! thx!! De rest b.t.w. ook natuurlijk.

Ennuh... met strings werken doen we niet aan ;) dat is wel heel erg duur ;) dus alleen als het echt niet anders kan ;)

Iig thx!! Het werkt nu eindelijk goed.

What are clouds made of? Linux servers mostly!


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 21:18

Tomatoman

Fulltime prutser

Paul Nieuwkamp schreef op 21 september 2002 @ 17:54:
[...]
Ik neem aan dat je een typo hebt gemaakt in je commentaar? Inhoudelijk kan ik er niet op ingaan (ken geen ASM), maar er staat nu 2x least significant bit...
Oeps :o, klopt helemaal. Asm is goed, maar commentaar moet als volgt zijn:
Delphi:
6
7
    BSR     ECX,Value    // positie van most significant bit met waarde 1
    BSF     EDX,Value    // positie van least significant bit met waarde 1

Een goede grap mag vrienden kosten.

Pagina: 1