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? :) ______________________________ Акция! Скидка до - 50% на колготы зимних коллекций в Линии магазинов EVA! http://go.meta.ua/eva_colgotes
Integer overflow. factorial 50 mod 2^32 = 0. Change "Int" to "Integer" to get the correct result (30414093201713378043612608166064768844377641568960512000000000000). On Mon, Jan 21, 2013 at 12:17 AM, <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? :)
______________________________ Акция! Скидка до - 50% на колготы зимних коллекций в Линии магазинов EVA! http://go.meta.ua/eva_colgotes
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell
-- Gregory Collins <greg@gregorycollins.net>
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.
ghc's Int is 32-bit on 32-bit platforms, according to maxBound. On Mon, 21 Jan 2013 02:26:34 +0100 Benoit T <benoit.triquet@gmail.com> wrote:
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
participants (4)
-
Benoit T -
Gregory Collins -
kudah -
miphis@meta.ua