On 1 March 2016 at 19:35, Arghya Das <arghya0...@gmail.com> wrote:
> $num = 1234;
> $sum = 0;
>
> while ( $num != 0)
> {
> $rem = $num % 10;
> $sum = ( $sum * 10 ) + $rem;
> $num = $num / 10;
> }
>
> print $sum;

I suspect you're just exceeding precision limits.

Modified code:

use strict;
use warnings;

my $num = 1234;
my $sum = 0;

while ( $num != 0) {

  my $rem = $num % 10;

  printf "* rem: %s, sum: %s, num: %s\n", $rem, $sum, $num;
  $sum = ( $sum * 10 ) + $rem;
  $num = $num / 10;
}

print $sum;

Output:


* rem: 4, sum: 0, num: 1234
* rem: 3, sum: 4, num: 123.4
* rem: 2, sum: 43, num: 12.34
* rem: 1, sum: 432, num: 1.234
* rem: 0, sum: 4321, num: 0.1234
* rem: 0, sum: 43210, num: 0.01234
* rem: 0, sum: 432100, num: 0.001234
* rem: 0, sum: 4321000, num: 0.0001234
* rem: 0, sum: 43210000, num: 1.234e-05
* rem: 0, sum: 432100000, num: 1.234e-06
* rem: 0, sum: 4321000000, num: 1.234e-07
* rem: 0, sum: 43210000000, num: 1.234e-08
* rem: 0, sum: 432100000000, num: 1.234e-09
* rem: 0, sum: 4321000000000, num: 1.234e-10
* rem: 0, sum: 43210000000000, num: 1.234e-11
* rem: 0, sum: 432100000000000, num: 1.234e-12
* rem: 0, sum: 4321000000000000, num: 1.234e-13
* rem: 0, sum: 43210000000000000, num: 1.234e-14
* rem: 0, sum: 432100000000000000, num: 1.234e-15
* rem: 0, sum: 4321000000000000000, num: 1.234e-16

...


* rem: 0, sum: 4.321e+306, num: 1.234e-304
* rem: 0, sum: 4.321e+307, num: 1.234e-305
* rem: 0, sum: Inf, num: 1.234e-306
* rem: 0, sum: Inf, num: 1.234e-307
* rem: 0, sum: Inf, num: 1.234e-308
* rem: 0, sum: Inf, num: 1.234e-309
* rem: 0, sum: Inf, num: 1.23399999999999e-310
* rem: 0, sum: Inf, num: 1.23399999999989e-311
* rem: 0, sum: Inf, num: 1.23399999999891e-312
* rem: 0, sum: Inf, num: 1.23399999999397e-313
* rem: 0, sum: Inf, num: 1.23400000009278e-314
* rem: 0, sum: Inf, num: 1.23400000206904e-315
* rem: 0, sum: Inf, num: 1.23399999712839e-316
* rem: 0, sum: Inf, num: 1.23400009594151e-317
* rem: 0, sum: Inf, num: 1.23399811967893e-318
* rem: 0, sum: Inf, num: 1.2339783570531e-319
* rem: 0, sum: Inf, num: 1.23417598331143e-320
* rem: 0, sum: Inf, num: 1.23516411460312e-321
* rem: 0, sum: Inf, num: 1.23516411460312e-322
* rem: 0, sum: Inf, num: 9.88131291682493e-324


If you modify the code to use arbitrary precision floating point, it
just runs forever.


So you possibly have a logic error. Though it depends entirely on what
you're trying to achieve.

If I had to guess, I'd say you expected " $num / 10 " to return an
integer, not a floating point value.

changing the last line of the "while" to read:

 $num = int ( $num / 10 );


Results in the following:
* rem: 4, sum: 0, num: 1234
* rem: 3, sum: 4, num: 123
* rem: 2, sum: 43, num: 12
* rem: 1, sum: 432, num: 1
4321



-- 
Kent

KENTNL - https://metacpan.org/author/KENTNL

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to