Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

vreemde php constructie

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Ik heb een select waarbij ik 1 als default optie wil.
Ik kwam tot deze constructie:

for ($i = 0.1; $i < 2.1; $i += 0.1)
echo "<option value=$i " . (($i > 0.9 && $i < 1) ? "selected='selected'" : "") . ">$i</option>";

$i == 1 werkte niet en ik heb gewoon zitten klooien tot ik wat vond wat wel werkte, merk op dat daar zelfs $i < 1 staat ipv $i <= 1, ik dacht voor de gekkerij eens proberen en het werkte nog ook.

Ik heb ook dingen als $i == '1' geprobeerd, what's going on?

[ Voor 7% gewijzigd door Verwijderd op 05-09-2011 23:18 ]


  • Exception
  • Registratie: Augustus 2006
  • Nu online
Is dit niet makkelijker?


PHP:
1
2
3
for ($i = 0.1; $i < 2.1; $i += 0.1) {
echo "<option value=\"" . $i . "\" " . (($i == 1) ? "selected=\"selected\"" :  "") . ">" . $i . "</option>";
}


Zoiets? Heb het uit mijn losse pols gedaan dus weet niet of het werkt.

Edit: Heb weer eens niet goed zitten lezen. Dit is precies hetzelfde als wat je zelf hebt geprobeerd. Excuses! Wat je kunt doen is niet met decimalen werken maar later gewoon delen door 10 ;-)

[ Voor 26% gewijzigd door Exception op 05-09-2011 23:23 ]


Verwijderd

Welkom in de wondere wereld van floating point getallen.
http://php.net/manual/en/language.types.float.php

Lees vooral dat grote rode blok.

  • Slurpie
  • Registratie: Oktober 2004
  • Laatst online: 26-11 20:56
Denk ook dat het makkelijker is om alles te vermendigvuldigen met 10 en de output delen door 10 ;)

PHP:
1
2
3
4
5
<?php
for ($i = 1; $i < 21; $i += 1) {
echo "<option value=\"" . ($i/10) . "\" " . (($i == 10) ? "selected=\"selected\"" :  "") . ">" . ($i/10) . "</option>";
}
?>

[ Voor 48% gewijzigd door Slurpie op 05-09-2011 23:24 ]


Verwijderd

Topicstarter
@Jeff
Nope, hij negeert die $i == 1 alsof het nooit gebeurt.

Thx voor de links , ik ga eens wat lezen, ben benieuwd.

Gelezen, ik dacht al zoiets, pfff zootje.
De truuk met 10 werkt prima..
Ik ben op het verkeerde been gezet door die automatische casting van php. In c moet je expliciet een double declareren. Php kan veel maar een int die je met stapjes van 0.1 kunt verhogen kan het niet. :)

[ Voor 95% gewijzigd door Verwijderd op 05-09-2011 23:52 ]


  • Sgreehder
  • Registratie: Juni 2004
  • Laatst online: 20-10 20:31
BC Math gebruiken, zie:

http://php.net/manual/en/book.bc.php

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Onzin. Fixed point gebruiken.

@TS en dus ook Sgreedher: neem onze Getallen en talstelsels FAQ eens door (vooral 13, 14 en 15) ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Verwijderd schreef op maandag 05 september 2011 @ 23:16:
Ik heb een select waarbij ik 1 als default optie wil.
Ik kwam tot deze constructie:

for ($i = 0.1; $i < 2.1; $i += 0.1)
echo "<option value=$i " . (($i > 0.9 && $i < 1) ? "selected='selected'" : "") . ">$i</option>";

$i == 1 werkte niet en ik heb gewoon zitten klooien tot ik wat vond wat wel werkte, merk op dat daar zelfs $i < 1 staat ipv $i <= 1, ik dacht voor de gekkerij eens proberen en het werkte nog ook.

Ik heb ook dingen als $i == '1' geprobeerd, what's going on?
Ik heb nooit php geprobeerd, ben meer een java/asp man maar ik zie wel waar het fout gaat, (($i > 0.9 && $i < 1) is hetzelfde als niets selecteren als je met .1 omhoog gaat. Als je er (($i > 0.9 && $i < 1.1) van zou maken zou het volgens mij moeten werken.

Toch?

Edit: net even de link van RobIII gevolgd en bij punt 2 raak je mij al kwijt, wiskunde ben ik nooit goed in geweest 8)7

[ Voor 7% gewijzigd door Verwijderd op 06-09-2011 00:05 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ja en nee; ook jij hebt niet helemaal door hoe floats werken ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

RobIII schreef op dinsdag 06 september 2011 @ 00:09:
[...]

Ja en nee; ook jij hebt niet helemaal door hoe floats werken ;)
Om de hint compleet te maken: het probleem dat met 1.0 optreedt kan natuurlijk ook optreden bij 0.9 en 1.1. ;)

'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.


Verwijderd

RobIII schreef op dinsdag 06 september 2011 @ 00:09:
[...]

Ja en nee; ook jij hebt niet helemaal door hoe floats werken ;)
Haha, ik ben dan ook, vind ik zelf tenminste, meer back-end developer dan front-end. Kan jij in het kort uitleggen waarom het werkt met < 1, zou niet mogen volgens mij.

En inderdaad ik houd niet zo van floats, je zou denken dat het altijd hetzelfde moet zijn maar mijn ervaring leert dat het niet zo is. Ben er met de storelocator die ik eerder dit jaar gemaakt heb tegenaan gelopen en dat was een gekke fix die ik erin moest verwerken.

Verwijderd

Verwijderd schreef op maandag 05 september 2011 @ 23:16:
Ik heb een select waarbij ik 1 als default optie wil.
Ik kwam tot deze constructie:

for ($i = 0.1; $i < 2.1; $i += 0.1)
echo "<option value=$i " . (($i > 0.9 && $i < 1) ? "selected='selected'" : "") . ">$i</option>";

$i == 1 werkte niet en ik heb gewoon zitten klooien tot ik wat vond wat wel werkte, merk op dat daar zelfs $i < 1 staat ipv $i <= 1, ik dacht voor de gekkerij eens proberen en het werkte nog ook.

Ik heb ook dingen als $i == '1' geprobeerd, what's going on?
Verwacht je ooit (lees: op korte termijn) die opties aan te moeten passen? Ik zou bijna zeggen, doe het gewoon zonder die hele for loop.

Dus, letterlijk gewoon alle options uitschrijven.

<option value=0.1>
<option value=0.2>
<...>
<option value=1.0 selected='selected'>
<...>

dan heb je geen gedoe met afrondingen, floats, etc, etc, etc, etc.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 06 september 2011 @ 00:17:
Kan jij in het kort uitleggen waarom het werkt met < 1, zou niet mogen volgens mij.
Dat staat beschreven in de FAQ waar ik naar linkte ;) Zie ook deze video vanaf 6:08 ongeveer. (De audio is de eerste paar minuten r*k maar dat wordt beter).
Verwijderd schreef op dinsdag 06 september 2011 @ 00:17:

dan heb je geen gedoe met afrondingen, floats, etc, etc, etc, etc.
Als je weet waar je mee bezig bent en de (IMHO) basiskennis van programmeren onder de knie hebt heb je ook geen "gedoe met afrondingen, floats, etc, etc, etc, etc." ;)

[ Voor 39% gewijzigd door RobIII op 12-10-2012 00:18 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

*ignores RobIII*

Enfin, nog een oplossing...

een array bouwen van de verschillende option values en dan dus maar gewoon met een integer door het array lopen.

$options = array(0.0, 0.1, 0.2... etc, etc);

for($i = 0; $i < 20; $i++)
{
echo('<option value="' . $options[$i] . '">');
}

het toevoegen van de default is dan natuurlijk dezelfde oplossing zoals je zelf ook al had maar dan dus er goed op letten dat je dus niet op de waarde maar de teller let. Enfin, het zijn 2 mogelijke oplossingen die het gehele punt waar je nu tegenaan loopt volledig wegnemen.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Kharay1977: waarom zou je überhaupt een workaround schrijven voor een probleem dat je met fixed point-datatypes niet eens hebt? ;)

'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.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
:D *ignores Kharay1977's ignorance* :P

PHP:
1
2
for($i = 1; $i <= 20; $i++)
  echo('<option value="' . round($i/10,1) . '">');

Wat nou arrays? :X

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op dinsdag 06 september 2011 @ 00:25:
*ignores RobIII*

Enfin, nog een oplossing...

een array bouwen van de verschillende option values en dan dus maar gewoon met een integer door het array lopen.

$options = array(0.0, 0.1, 0.2... etc, etc);

for($i = 0; $i < 20; $i++)
{
echo('<option value="' . $options[$i] . '">');
}

het toevoegen van de default is dan natuurlijk dezelfde oplossing zoals je zelf ook al had maar dan dus er goed op letten dat je dus niet op de waarde maar de teller let. Enfin, het zijn 2 mogelijke oplossingen die het gehele punt waar je nu tegenaan loopt volledig wegnemen.
Loops handmatig unrollen gaat ook nogal voorbij aan het punt van automatiseren he...

All my posts are provided as-is. They come with NO WARRANTY at all.


Verwijderd

Topicstarter
Ik ben op het verkeerde been gezet door die automatische casting van php. In c moet je expliciet een double declareren. Php kan veel maar een int die je met stapjes van 0.1 kunt verhogen kan het niet.

Verwijderd

NMe schreef op dinsdag 06 september 2011 @ 00:26:
Kharay1977: waarom zou je überhaupt een workaround schrijven voor een probleem dat je met fixed point-datatypes niet eens hebt? ;)
Waarom zou je overbodige loops schrijven als de content (hoogstwaarschijnlijk) toch niet dynamisch is? (zie mijn aanpak nr. 1).

En aanpak 2... ach, het was maar een gedachte. En deze post is meteen ook mijn laatste bijdrage aan dit verhaal, de reacties die ik krijg op goed bedoelde oplossingen zijn extreem vermoeiend.

Het impliceren van een gebrek aan kennis en/of onkunde danwel onwetenheid aan mijn kant, ach... speelkwartiertje is voorbij.

Verwijderd

RobIII schreef op dinsdag 06 september 2011 @ 00:19:
[...]

Dat staat beschreven in de FAQ waar ik naar linkte ;) Zie ook deze video vanaf 6:08 ongeveer. (De audio is de eerste paar minuten r*k maar dat wordt beter).


[...]

Als je weet waar je mee bezig bent en de (IMHO) basiskennis van programmeren onder de knie hebt heb je ook geen "gedoe met afrondingen, floats, etc, etc, etc, etc." ;)
Die video is goed, thankies :)

Ik ga morgen die faq nog eens lezen, zelfs na bijna 8 jaar webdevelopment maak ik deze fout nog :(

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 06 september 2011 @ 00:41:
[...]

Waarom zou je overbodige loops schrijven als de content (hoogstwaarschijnlijk) toch niet dynamisch is? (zie mijn aanpak nr. 1).
Ik had ooit een formulier in Delphi waarin ik 40 dezelfde controls neerzette, maar dan steeds op een andere (vaste) locatie. Had ik die dan ook maar direct op het form moeten klikken in plaats van de dubbele loop die het voor me automatiseerde? Iets 20x uitschrijven in plaats van een loopje van twee regels alleen om een floatingpointprobleem op te lossen is erg zonde.
En aanpak 2... ach, het was maar een gedachte. En deze post is meteen ook mijn laatste bijdrage aan dit verhaal, de reacties die ik krijg op goed bedoelde oplossingen zijn extreem vermoeiend.

Het impliceren van een gebrek aan kennis en/of onkunde danwel onwetenheid aan mijn kant, ach... speelkwartiertje is voorbij.
Jammer dat je goedbedoelde kritiek zo opvat. :)

'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.


Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 06 september 2011 @ 00:41:
[...]

Waarom zou je overbodige loops schrijven als de content (hoogstwaarschijnlijk) toch niet dynamisch is? (zie mijn aanpak nr. 1).

En aanpak 2... ach, het was maar een gedachte. En deze post is meteen ook mijn laatste bijdrage aan dit verhaal, de reacties die ik krijg op goed bedoelde oplossingen zijn extreem vermoeiend.

Het impliceren van een gebrek aan kennis en/of onkunde danwel onwetenheid aan mijn kant, ach... speelkwartiertje is voorbij.
Overbodige loops? Je doet me denken aan die straffen van de lagere school vroeger, schrijf 100 keer 'ik mag dat niet meer doen'. En bovendien is het veel meer code dus niet efficienter.

[ Voor 3% gewijzigd door Verwijderd op 06-09-2011 08:08 ]


Verwijderd

Als ik het volgende doe werkt het.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE HTML>
    <head>
        <title>PHP Test</title>
    </head>
    <body>
        <select>
        <?php
            for($i = 0.1; $i < 2.1; $i += 0.1)
            {
            ?>
            <option value="<?php echo $i; ?>" <?php if($i > 0.9 && $i < 1.0) echo "selected"; ?>><?php echo $i; ?></option>
            <?php
            }
        ?>
        </select>
    </body>
</html>

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Anders lees je het topic even. Die oplossing is al gepost, evenals de reden waarom het niet handig is om die te 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.


  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 09-11 14:42
Sorry, moest het echt even zeggen:
Verwijderd schreef op dinsdag 06 september 2011 @ 00:40:
[..] Php kan veel maar een int die je met stapjes van 0.1 kunt verhogen kan het niet.
Maakt weinig uit in welke taal je het probeert hoor. Een integer ophogen met 0.1 zal nooit resulteren in een integer ;)

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:09

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op dinsdag 06 september 2011 @ 00:17:
[...]

Haha, ik ben dan ook, vind ik zelf tenminste, meer back-end developer dan front-end.
Hoezo, "ik ben dan ook..."? Juist bij een back-ender (die veel meer met business logica werkt) zou kennis van floating point gedrag erin moeten zitten.
Kan jij in het kort uitleggen waarom het werkt met < 1, zou niet mogen volgens mij.
Heel simpel, 0.1 als float is in werkelijkheid iets kleiner dan 0.1. Als je die met 10 vermenigvuldigt is het resultaat kleiner dan 1. Dat het met <=1 niet zou werken is imho gewoon onzin, de TS zal zich wel vergissen.

Verder:
PHP:
1
2
3
4
5
6
7
function floatequals($a, $b, $significance = 1e-10)
{
    return abs($a - $b) < $significance * (abs($a) + abs($b));
}

for ($i = 0.1; $i < 2.1; $i += 0.1)
    echo "<option value=$i " . (floatequals($i, 1) ? "selected='selected'" : "") . ">$i</option>";

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.


  • HuHu
  • Registratie: Maart 2005
  • Niet online
wjzijderveld schreef op donderdag 08 september 2011 @ 12:33:
Sorry, moest het echt even zeggen:

[...]


Maakt weinig uit in welke taal je het probeert hoor. Een integer ophogen met 0.1 zal nooit resulteren in een integer ;)
C++:
1
2
int a(5);
a += 0.1;


Volgens mij is a nog steeds een int hoor?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

...die vervolgens niet 5.1 is. Laten we niet gaan mierenneuken over dat soort dingen, ik neem aan dat we allemaal wel weten wat er bedoeld wordt. :)

'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.


  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 26-11 20:53

Ventieldopje

I'm not your pal, mate!

Is dit niet een taak voor gmp_cmp?

PHP:
1
2
3
4
5
6
<?php
if(gmp_cmp($i, 1.0) == 0)
{
   // $i is gelijk aan 0, hier de rest van je code!
}
?>


Iets in die buurt?

gmp_cmp: http://www.php.net/manual/en/function.gmp-cmp.php

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Succes daarmee:
These functions allow you to work with arbitrary-length integers using the GNU MP library.
Emphasis mine. ;)

'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.


  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 26-11 20:53

Ventieldopje

I'm not your pal, mate!

GMP - GNU Multiple Precision
Tja, wat is het nu :/

Nou goed, dan gebruik je bccomp zie het probleem niet zo :+

[ Voor 51% gewijzigd door Ventieldopje op 08-09-2011 15:18 ]

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Heel dat geziemel met floats is gewoon nergens voor nodig; in dit geval is fixed point veel handiger.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:09

.oisyn

Moderator Devschuur®

Demotivational Speaker

ints hebben ook precisie hoor.
Nou goed, dan gebruik je bccomp zie het probleem niet zo :+
Het probleem is dat je de topic niet leest.
.oisyn in "vreemde php constructie"

Beetje suf om terug te vallen om arbitrary precision arithmetic 8)7
RobIII schreef op donderdag 08 september 2011 @ 15:20:
Heel dat geziemel met floats is gewoon nergens voor nodig; in dit geval is fixed point veel handiger.
In dit geval wel ja. Maar wat als die floats nu niet hardcoded zijn?

[ Voor 69% gewijzigd door .oisyn op 08-09-2011 15:21 ]

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.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.oisyn schreef op donderdag 08 september 2011 @ 15:20:
Maar wat als die floats nu niet hardcoded zijn?
Dan moet je ze als floats behandelen en rekening houden met hoe floats werken; ik neem aan dat jij en ik 't daar wel over eens zijn...

Als je met floats werkt heb je gewoon te maken met de "problemen"* die floats hebben en daar hou je, als je kaas hebt gegeten van waar je mee bezig bent, gewoon rekening mee.

* "Problemen" als in: net zoals integers geen fracties kunnen opslaan. Floats hébben geen problemen, enkel wat 'eigenaardigheidjes'.

[ Voor 36% gewijzigd door RobIII op 08-09-2011 15:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:09

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mijn punt is, dan kun je die methodiek dus nu net zo goed ook toepassen.

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.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.oisyn schreef op donderdag 08 september 2011 @ 15:24:
Mijn punt is, dan kun je die methodiek dus nu net zo goed ook toepassen.
Dat kan ja; ik vind 't alleen wat overkill om hier een floatequals functie voor te moeten introduceren (of worse: heel de bcmath/whatever meuk voor in je PHP te moeten compilen/includen/weet_ik_het). Daarom zei ik ook in dit geval.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 09-11 14:42
HuHu schreef op donderdag 08 september 2011 @ 14:57:
[...]
C++:
1
2
int a(5);
a += 0.1;


Volgens mij is a nog steeds een int hoor?
.oisyn schreef op donderdag 08 september 2011 @ 15:20:
[...]

ints hebben ook precisie hoor.

[...]
En ik maar denken dat integers gehele getallen zijn.... 8)7
Ben welbekend met floats, eerste ervaring is altijd pijnlijk :P, maar dat integers precision hebben is toch nieuw voor me.
Nadeel van voornamelijk met PHP werken, daar merk je verschil tussen types niet zo snel.

edit: Kleine test gedaan, nu ben ik echt in de war...
code:
1
2
[willemjan ~]$ php -r '$x = 1; var_dump(is_int($x+=0.1));';
bool(false)

[ Voor 10% gewijzigd door wjzijderveld op 08-09-2011 15:36 . Reden: nieuwe bevinding ]

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:09

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dan denk jij vast dat precisie staat voor aantal cijfers achter de komma, terwijl het feitelijk aantal significante cijfers betekent (dus zowel voor als achter de komma). 123 is net zo precies als 0.00123. Logisch als je bedenkt dat 0.00123 ook te schrijven is als 123e-5.

Een (signed) int heeft typisch 31 bits aan precisie. Een single precision float slechts 24. Een double precision float 53. Ja, idd, een int is dus precieser dan een single precision float. 16777217 past prima in een int, maar niet in een float (wordt afgerond naar 16777216).

[ Voor 57% gewijzigd door .oisyn op 08-09-2011 15:40 ]

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.


  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 09-11 14:42
Oh ja, natuurlijk. Stom van me... Achteraf wist ik het wel, maar op de een of andere manier vergeet ik het ook elke keer 8)7

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


Verwijderd

Topicstarter
Dat het met <=1 niet zou werken is imho gewoon onzin, de TS zal zich wel vergissen.
In dit geval is het eerder een kwestie van goed lezen, ik zei dat zelfs < 1 werkt ipv <= 1. O-)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:09

.oisyn

Moderator Devschuur®

Demotivational Speaker

't Is maar het hoe je "in plaats van" interpreteert, maar fair enough ;)

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.


  • kluyze
  • Registratie: Augustus 2004
  • Niet online
wjzijderveld schreef op donderdag 08 september 2011 @ 15:33:
edit: Kleine test gedaan, nu ben ik echt in de war...
code:
1
2
\[willemjan ~]$ php -r '$x = 1; var_dump(is_int($x+=0.1));';
bool(false)
Dat is omdat php niet strong typed is, $x kan zowel een int als float als zelfs een string zijn.
PHP:
1
2
3
4
$x = 1;
var_dump(is_int($x));
$x = "Hello World!?";
var_dump(is_int($x));
De eerste var_dump geeft true, de 2de false.

Strong typed talen hebben dit niet en zullen meestal zelfs niet compileren als je dit probeert.
De wikipedia pagina over strong en weak typed heeft ook een mooi voorbeeld hierover.

  • telefoontoestel
  • Registratie: Oktober 2002
  • Laatst online: 29-06-2024

telefoontoestel

Maak me gelukkig....Bel!!

ik heb geen gelegenheid om te controleren, maar hoor je in dit geval niet te vergelijken met 1.0?

telefoontoestel


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

telefoontoestel schreef op zondag 11 september 2011 @ 15:39:
ik heb geen gelegenheid om te controleren, maar hoor je in dit geval niet te vergelijken met 1.0?
Waarom zou dat verschil moeten maken in een taal die zoals in de post boven je al gezegd wordt weak typed is?

'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.


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tja, het antwoord op alle vragen in dit topic valt onder 2 stukken basiskennis: basiskennis datatypes (ints vs floats) en basiskennis PHP/weak typed languages.

{signature}


  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 09-11 14:42
kluyze schreef op zaterdag 10 september 2011 @ 22:23:
[...]
Dat is omdat php niet strong typed is, $x kan zowel een int als float als zelfs een string zijn.
PHP:
1
2
3
4
$x = 1;
var_dump(is_int($x));
$x = "Hello World!?";
var_dump(is_int($x));
De eerste var_dump geeft true, de 2de false.

Strong typed talen hebben dit niet en zullen meestal zelfs niet compileren als je dit probeert.
De wikipedia pagina over strong en weak typed heeft ook een mooi voorbeeld hierover.
Mijn post was een reactie op het C++ voorbeeld hè? HuHu schreef dat het nog steeds een int was na 0.1 erbij op te tellen.
Dat PHP loosely typed is weet ik, ik teste dus enkel uit of het echt een int bleef, wat dus niet het geval was. PHP maakt er een double van. Maar wat ik me nu wel afvraag (als het niet meer in dit topic hoort, negeer me dan maar ;)): is het dan in C++ echt nog steeds een int? Of krijg je een error? En In het eerste geval, blijft 1 + 0.1 dan gewoon 1?

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:09

.oisyn

Moderator Devschuur®

Demotivational Speaker

bij de expressie x + 0.1 wordt x gepromoot naar een double, en het resultaat is ook een double. Als je die zou assignen aan een int dan wordt de double weer getruncatet.

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.


  • wjzijderveld
  • Registratie: Augustus 2005
  • Laatst online: 09-11 14:42
Dank, mijn originele opmerking klopte dus wel, een int + 0.1 zal geen int blijven...

Canon EOS60D | Canon 100mm f/2.8 USM | Canon 100-400mm f/4.5-5-6L | Canon 10-22mm f/3.5-4.5 USM | Canon 430EX II

Pagina: 1