algoritme voor truncate()

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • link0007
  • Registratie: Augustus 2006
  • Niet online
In een scripttaal van een spelletje dat ik wel 'ns speel, is geen truncate functie aanwezig. Nu ben ik al uren aan het zoeken op het internet voor een manier om de integer van een float te berekenen.

Dus dit is wat ik wil:

2.123 geeft 2
2.72 geeft 2
2.0 geeft 2
etc

Nu heb ik redelijk veel formules gevonden, maar geen enkele die echt bedenkt dat er geen round/floor/ceil/whatever functionaliteit aanwezig is :X


Weet iemand hier hoe je het integer gedeelte van een getal vind?

de volgende functies kunnen gebruikt worden:

- trigonometrische functies (sin/cos/tan/etc)
- machten
- optellen/aftrekken/vermenigvuldigen/delen
- modulus

[ Voor 14% gewijzigd door link0007 op 04-04-2009 03:15 ]

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;


Acties:
  • 0 Henk 'm!

  • keejoz
  • Registratie: November 2008
  • Laatst online: 28-08 15:53
in een while loop de modulus berekenen tot je modulus 0 teruggeeft?

maar een gok

Acties:
  • 0 Henk 'm!

  • ToFast
  • Registratie: Mei 2004
  • Laatst online: 25-01 12:49
Kan je niet gewoon van een getal of het nou een double/float is, het 1e getal/karakter uitlezen? Dit levert bij getallen groter dan 9 dus weer een probleem op, dat wel.

Acties:
  • 0 Henk 'm!

  • link0007
  • Registratie: Augustus 2006
  • Niet online
nee, je hebt geen beschikking over echte data functies .

@keejoz: de modulus waarvan? de real en ...?

Kan zijn dat mijn vermoeide hersenen m'n wiskunde verpesten, maar ik kom er echt niet uit |:(

[ Voor 112% gewijzigd door link0007 op 04-04-2009 03:38 ]

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Begin eens met vertellen welk spel en/of welke scriptingtaal we het over hebben. Ik kan hier wel vanalles gaan roepen, maar uiteindelijk werkt dat misschien niet omdat jij niet genoeg info geeft...

Mocht al het andere falen:
PHP:
1
2
3
4
5
function myFloor($getal)
{
  for ($i = 0; $i < $getal; $i++);
  return $i - 1;
}

Werkt alleen bij positieve getallen en er zijn vast wel mooiere dingen te verzinnen, maar ik ben moe en heb geen zin om verder na te denken. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Xiliath
  • Registratie: Oktober 2003
  • Laatst online: 30-10-2022
kan je niet beter doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if( $getal > 0){
  for( $i = 0 ;$i < $getal; $i++ ){
    if( $i + 1 > $getal){
      return $i;
    }
  }
}
else(
  for( $i = 0 ;$i > $getal; $i-- ){
    if( $i - 1 < $getal){
      return $i;
    }
  }
)

[ Voor 51% gewijzigd door Xiliath op 04-04-2009 04:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als je comparisons kan doen tussen floats en ints, dan kan je binair zoeken naar de dichtstbijzijnde integer die onder je float ligt. Dus je zoekruimte is INT_MIN t/m INT_MAX, en die ga je steeds in 2en delen tot je de juiste te pakken hebt.

Wikipedia: Binary search algorithm

Dat is O(log N) in tegenstelling tot de O(N) oplossingen van NMe en wappie.

Maar aangezien het al op de een of andere manier ge-encodeerd zit in de floating-point, moet je vast ook met wat minder berekeningen de integer kunnen uitvogelen.

[ Voor 42% gewijzigd door Verwijderd op 04-04-2009 05:02 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

wappie1980 schreef op zaterdag 04 april 2009 @ 04:10:
kan je niet beter doen:

[..]

(bij positieve getallen)
Mijn code doet exact hetzelfde zonder een extra vergelijking. ;) In welk opzicht zou dit beter moeten zijn? :)

edit:
De check op negatieve waarden zou dan wel een toevoeging zijn, maar ook die zou op mijn manier een overbodige vergelijking schelen. ;)

[ Voor 20% gewijzigd door NMe op 04-04-2009 04:28 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Xiliath
  • Registratie: Oktober 2003
  • Laatst online: 30-10-2022
NMe schreef op zaterdag 04 april 2009 @ 04:22:
[...]

Mijn code doet exact hetzelfde zonder een extra vergelijking. ;) In welk opzicht zou dit beter moeten zijn? :)
Het is iets duidelijker voor de beginnende coder ;)
En ik heb m net aangepast zodat ie ook voor negatieve getallen werkt.

(en ja, jouw code is korter ;) )

Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
x - (x mod 1)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ja, dat mag dus niet. Een beetje met mod 1 aankomen zetten terwijl het ook veel moeilijker kan. :+

Ook simpel: Als het enkel een integer bij de presentatie moet zijn, zoeken naar een printf()-achtige functie.

Maar goed, we weten nog steeds het de taal in kwestie niet. Misschien is het wel strong typed en is een assignment aan een integer al voldoende. :)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Round(x - 0.5) ;)

edit: dit mag dus niet :+ die oplossing met modulus moet kunnen dan.

[ Voor 67% gewijzigd door Verwijderd op 04-04-2009 11:22 ]


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int floor(float x)
{
  int sign = x > 0 ? 1 : -1;
  x = abs(x);
  int ret = 0;
  for (int i = 30;  i >= 0; i--)
  {
    int n = 1 << i;
    if (x > n)
    {
       x -= n;
       ret += n;
    }
  }
  return ret * sign;
}

Zoiets?

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • link0007
  • Registratie: Augustus 2006
  • Niet online
mod(x,1) :o

Nooit aan gedacht dat dat ook zou werken :+


Maar dan nog vind ik het een interessante vraag.. het blijkt lastig te zijn om mod of floor te berekenen zonder lus te gebruiken?

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;


Acties:
  • 0 Henk 'm!

Verwijderd

Voor modulus heb je geen loop nodig. Je schrijft in je openingspost dat je modulus kunt gebruiken dus probleem opgelost lijkt je ;) of werkt die modulus alleen met integers?

mod(x, 1) geeft alleen de fractie terug. Die moet je juist van x afhalen. Toch?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

link0007 schreef op zaterdag 04 april 2009 @ 13:19:
Maar dan nog vind ik het een interessante vraag.. het blijkt lastig te zijn om mod of floor te berekenen zonder lus te gebruiken?
_js_ in "algoritme voor truncate()" zegt toch letterlijk wat je moet doen?

Ik had trouwens in de startpost over de functies die je wél kon gebruiken heen gelezen, dus deed ik het maar met standaardwiskunde. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • link0007
  • Registratie: Augustus 2006
  • Niet online
ja, maar hoe werkt die mod dan weer intern? ;)

als jij zegt dat
mod(a,b) = a-b*floor(a/b)

en dan zegt dat

floor(a) = a-mod(a,1)

en dan moet je dus wel terug slaan op een van de bovenstaande manieren om in een lus de modulus of de floor te berekenen :)

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom heb je een lus nodig?

2.49 mod 1 geeft 0.49 terug. 2.49 - 0.49 = 2, de uitkomst die je wil. Dus: 2.49 - (2.49 mod 1) == 2. Dan heb je je uitkomst toch al? Waarom wil je precies een lus gebruiken? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Het kan in een gesloten expressie van elementaire functies (wat floor(x) ook meteen een elementaire functie maakt).

code:
1
2
3
4
5
6
floor(x) = x - (1/2) ( 1 + d/dx Of(x) [Of(x) - Of(x+-1)] )

met

Of(x) = 2 abs(arcsin(cos(Pi x / 2)))/Pi
d/dx Of(x) = -sin(Pi x) / sqrt(1 - cos^2(Pi x))


Zal het zo eens testen, misschien heb ik een foutje gemaakt.

als je floor hebt is de rest makkelijk, zoals round, ceil, float part, integer part, etc.

[ Voor 11% gewijzigd door Zoijar op 04-04-2009 14:44 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

floor is trouwens geen truncate. floor(-1.8) returnt -2, truncate(-1.8) returnt -1.
trunc(x) { return x >= 0 ? floor(x) : -floor(-x); }

[ Voor 24% gewijzigd door .oisyn op 04-04-2009 14:54 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Klopt. Zoals ik al zei, als je floor hebt is de rest makkelijk, zoals integer part (de functie int(x), i.e. "truncate") ;)

Acties:
  • 0 Henk 'm!

  • link0007
  • Registratie: Augustus 2006
  • Niet online
Zoijar schreef op zaterdag 04 april 2009 @ 14:42:
Het kan in een gesloten expressie van elementaire functies (wat floor(x) ook meteen een elementaire functie maakt).

code:
1
2
3
4
5
6
floor(x) = x - (1/2) ( 1 + d/dx Of(x) [Of(x) - Of(x+-1)] )

met

Of(x) = 2 abs(arcsin(cos(Pi x / 2)))/Pi
d/dx Of(x) = -sin(Pi x) / sqrt(1 - cos^2(Pi x))


Zal het zo eens testen, misschien heb ik een foutje gemaakt.

als je floor hebt is de rest makkelijk, zoals round, ceil, float part, integer part, etc.
okee, dat met die sinussen gaat me net iets boven m'n wiskunde niveau :+

Maar met mod kan het prima opgelost worden hoor, het is alleen grappig om te bedenken hoe veel moeite een computer doet om dergelijke functies op te lossen :)

wat ik ervan gemaakt heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
math.sign = (number) =>
{
    sign := 0;
    (number<0)?{sign=(-1)}:false;
    (number>0)?{sign=1}:false;
    sign;
};
math.abs = (number) =>
{
    number*math.sign(number);
};
math.floor = (number) =>
{
     number >= 0 ? number - math.mod(number, 1) : (math.mod(number, 1) == 0 ? number : number - math.mod(number, 1) - 1)};
};
math.ceil = (number) =>
{
    fpart:=math.mod(number,1);
    ipart:=number-fpart;
    (number>0)?{ipart=(math.abs(fpart)>0)?(ipart+1):ipart}:{ipart=(math.abs(fpart)>0)?(ipart-1):ipart};      
    ipart;
};

math.round = (number,precision) =>
{
    fpart:=math.mod(number,1);
    ipart:=number-fpart;
    roundfloat:=fpart*math.pow(10,precision);
    roundfloat = (math.abs(math.mod(roundfloat,1))>=0.5)?{math.ceil(roundfloat)}:{math.floor(roundfloat)};
    roundfloat = roundfloat/math.pow(10,precision);
    answer:=ipart+roundfloat;
    answer;
};


die truncate bleef lastig doen.. vooral omdat het programma in kwestie nogal onnauwkeurig omgaat met floats (0.2 word 0.1999999981 ofzo).

Is die round zo goed? Op internet staan vele soorten rounds beschreven.. ik had geen idee welke ik moest pakken 8)7

[ Voor 2% gewijzigd door link0007 op 04-04-2009 17:26 . Reden: zat een fout in floor functie ]

IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;

Pagina: 1