[prev in list] [next in list] [prev in thread] [next in thread] 

List:       haskell
Subject:    Re: [Haskell] Silent error
From:       Benoit T <benoit.triquet () gmail ! com>
Date:       2013-01-21 1:26:34
Message-ID: 20130121012634.GA21431 () nostromo2 ! localdomain
[Download RAW message or body]

On Mon, Jan 21, 2013 at 01:17:17AM +0200, miphis@meta.ua wrote:
> The program looks like this:
> 
> --***********************
> factorial :: Int->Int
> factorial n = product [1..n]
> 
> main = do
>         print $ factorial 50
> --***********************
> 
> And that yields "0" (no errors). Is it a bug or feature? :)

Int is fixed-size (*) and is expected to use modular arithmetics (**)
therefore there is no notion of overflow, it just computes modulo
maxBound::Int

You must have been using a 32-bit haskell, that uses full-word Int, such
as HUGS, and it turns out that using 32-bit signed integers, you
eventually get -2**31 (this happens for n==32) and then multiplying by
any even integer yields 0 (34!==0).

GHC uses 31-bit or 63-bit Int (on 32- or 64-bit arch) and does not
encounter this case before factorial 50 (however the answer is also not
what you may have been expecting because it still doesn't fit).

cheers

*: this is specified in the standard
**: this does not seem to be specified in the standard

-- 
Benoit Triquet <benoit.triquet at gmail.com>
 .''`.
: :' :      We are debian.org. Lower your prices, surrender your code.
`. `'       We will add your hardware and software distinctiveness to
  `-        our own. Resistance is futile.

_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic