Re: Re: Jaw Breaker - What's the ansewer?
| From: | JC Botha | Date: | Thu, 21 Apr 2005 18:31:10 +0000 |
| Subject: | Re: Re: Jaw Breaker - What's the ansewer? | ||
| References: | 1 | Groups: | php.windows |
| Request: | Send a blank email to php-windows+get-25895@lists.php.net to get a copy of this message | ||
Hi Jin,
Yes that also buged me, had no idea why it does that. I also battled
with this one for a while. Perhaps there are more on the mailing list
that got some info on this technical point.
Thanks for your intrest!
Chris
On 4/21/05, Wu, Jin Yong <jinyong.wu@chn.xerox.com> wrote:
>
> It's so interesting. At the beginning, I missed the statement "$x =
> round($x, 2) + 0.01;",
> and can't get corrent answer.Then, I trace the $x value, I found its value
> was changed to have
> 13 decimal places from 4.43 on. Could you explain it for me?thank you ahead.
>
> -----Original Message-----
> From: JC Botha [mailto:odegos@gmail.com]
> Sent: Wednesday, April 20, 2005 19:50 PM
> To: graeme
> Cc: php-windows@lists.php.net
> Subject: Re: [PHP-WIN] Re: Jaw Breaker - What's the ansewer?
>
> Well done Graeme!
>
> Posted below is what I used to generate the asnwer, I myself had
> dificulty to get it. Let me know if you used another method.
>
> The Source Code
> ==================================================
> <?php
> function f($c) {
> $c++;
> if ($c % 2) { return f($c); }
> return $c++;
> }
>
> function g($n) {
> for ($i=1;$i<10;$i++) {
> $n = f($n*$i);
> }
> return ($n);
> }
> $x = 0.00;
> while ($x < 10){
>
> $x = round($x, 2) + 0.01;
> $l = (g($x));
>
> if ($l == 4277108){
> echo("<font color='red'>:: x = $x : $l</font>
> <br/>");
> }
> //echo ("> $x : $l<br/>");
>
> }
>
> ?>
>
> =================================================
>
> On 4/20/05, graeme <graeme_foster@sherubtse.edu.bt> wrote:
> > Yes it is an issue with floating point numbers since:
> >
> > 8.35 will give the answer but if you increment by .01 in a loop then you
> > will not get the answer, when it is on 8.35. However, increment by 0.001
> > then 8.35 will provide the correct answer. It's all to do with how in
> > calculates 0.01 in binary, a rational fraction in binary.
> >
> > graeme.
> >
> > JC Botha wrote:
> >
> > >It is possible, and "10.642868165785" is incorrect. The question says
> > >"$x is a number between 1 and 10 and has 2 decimal places."
> > >
> > >Try again, if more try then I will post the source code that generates
> > >the asnwer?
> > >
> > >
> > >
> > >On 4/20/05, M. Sokolewicz <tularis@php.net> wrote:
> > >
> > >
> > >>JC Botha wrote:
> > >>
> > >>
> > >>>The following is a section of PHP code (see Apache.org and PHP.net).
> > >>>
> > >>> function f($c) {
> > >>> $c++;
> > >>> if ($c % 2) { return f($c); }
> > >>> return $c++;
> > >>> }
> > >>>
> > >>> function g($n) {
> > >>> for ($i=1;$i<10;$i++) {
> > >>> $n = f($n*$i);
> > >>> }
> > >>> return ($n);
> > >>> }
> > >>>
> > >>> print(g($x));
> > >>>
> > >>>What is the smallest value that $x can have if 4277108 is outputted to
> > >>>the screen after running this code?
> > >>>$x is a number between 1 and 10 and has 2 decimal places.
> > >>>
> > >>>
> > >>it's not a jawbreaker, it's impossible IMO.
> > >>f() always returns the number if it's uneven, or if it's even, it
> > >>returns (n+1). So, it always returns uneven. which means the result of
> > >>g() can *never* be even.
> > >>
> > >>[[side note:
> > >>unless "return $c++;" does first add 1 to it before returning, but I
> > >>think it doesn't, since it's a postincrement operator.
> > >>]]
> > >>
> > >>--
> > >>PHP Windows Mailing List (http://www.php.net/)
> > >>To unsubscribe, visit:
> > >>http://www.php.net/unsub.php
> > >>
> > >>
> > >>
> > >>
> > >
> > >
> > >
> >
> > --
> > Experience is a good teacher, but she sends in terrific bills.
> >
> > Minna Antrim
> >
> >
>
> --
> PHP Windows Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>