Version française
Home     About     Download     Resources     Contact us    
Browse thread
if (n:int) < 0 then (-n) > 0 is FALSE
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jonathan Roewen <jonathan.roewen@g...>
Subject: Re: [Caml-list] if (n:int) < 0 then (-n) > 0 is FALSE
It's not a bug -- you're relying on 32bit ints when OCaml has only
31bit ints (on 32-bit arch). In C (for example), if you use a plain
int (I believe it'll default to signed), you get the exact same
behaviour when the number overflows 2^31.

The only difference here is that unlike C and many other languages,
OCaml has no unsigned numeric type. However, even if it were unsigned,
you still can't avoid a hard limit on maximum integer value.

My recommendation would be to use the Nums library so you don't get
overflow errors, or do an overflow check and throw an exception.

Jonathan

On 12/8/06, Pal-Kristian Engstad <pal_engstad@naughtydog.com> wrote:
> Using OCaml 3.08.3 on the following function:
>
> let pow x n =
>  let rec aux x n acc =
>    if n == 0 then acc
>    else if n == 1 then acc *. x
>    else if n land 1 == 0 then aux (x*.x) (n/2) acc
>    else aux (x*.x) ((n-1)/2) (x*.acc)
>  in
>    if n >= 0 then
>      aux x n 1.0
>    else
>      1.0 /. (aux x (-n) 1.0)
> ;;
>
> I tested this function with
>
> # pow 1.0 (1024 * 1024 * 1024)
>
> To find that it loops forever. The reason is that 1024*1024*1024=2^30
> cannot be represented as a positive number on 32-bit platforms, hence it
> silently converts it to -1073741824, or -2^30. The reason this loops
> again is that -n = -(-20^30) = -20^30......, still negative!
>
> This is obviously a bug - has it since been fixed? But more alarmingly -
> why is there no warning?
>
> Thanks,
>
> PKE.
>
> --
> Pål-Kristian Engstad (engstad@naughtydog.com), Lead Programmer, ICE
> team, Naughty Dog, Inc., 1601 Cloverfield Blvd, 6000 North,
> Santa Monica, CA 90404, USA. Ph.: (310) 633-9112.
>
> "Most of us would do well to remember that there is a reason Carmack
> is Carmack, and we are not Carmack.",
>                       Jonathan Blow, 2/1/2006, GD Algo Mailing List
>
>
>
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>