caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Need unsigned int
@ 2003-01-20 19:05 Christoph Bauer
  2003-01-20 20:58 ` Sven Luther
  2003-01-22 14:55 ` Nicolas Cannasse
  0 siblings, 2 replies; 6+ messages in thread
From: Christoph Bauer @ 2003-01-20 19:05 UTC (permalink / raw)
  To: caml-list

Hi, 

my program need to calculate a hash key of a matrix (with dimension 8
x 8).  It is necessary that this calculation is very fast, so my
program will update the hash key after every small modification of the
matrix. My problem is that the hash key should be an unsigned int
or an unsigned long in. 

My problem occurs here (Mersenne prime number 2^31-1):
let big_prim = 2147483647
val big_prim : int = -1

Thanks in advance for your support,
Christoph Bauer

-- 
proc self {} {foreach c [split [info body self] ""] d {14 -7 0 0 4 -67 4 73 11
69 24 -83 -15 6 -4 -84 78 20 11 -78 -1 -1 79 19 -8 4} { binary scan $c c c
if {[catch {append r [format %c [expr $c+$d]]}]} {return $r};}};puts [self]
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] Need unsigned int
  2003-01-20 19:05 [Caml-list] Need unsigned int Christoph Bauer
@ 2003-01-20 20:58 ` Sven Luther
  2003-01-22 14:55 ` Nicolas Cannasse
  1 sibling, 0 replies; 6+ messages in thread
From: Sven Luther @ 2003-01-20 20:58 UTC (permalink / raw)
  To: Christoph Bauer; +Cc: caml-list

On Mon, Jan 20, 2003 at 08:05:38PM +0100, Christoph Bauer wrote:
> Hi, 
> 
> my program need to calculate a hash key of a matrix (with dimension 8
> x 8).  It is necessary that this calculation is very fast, so my
> program will update the hash key after every small modification of the
> matrix. My problem is that the hash key should be an unsigned int
> or an unsigned long in. 
> 
> My problem occurs here (Mersenne prime number 2^31-1):
> let big_prim = 2147483647
> val big_prim : int = -1

Solution #1 : buy yourself a 64bit box, and you will have integers upto
2^63-1 :)))

Solution #2 : Use the Int64 module.

Solution #3 : Use the ocaml bignum module.

Friendly,

Sven Luther
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] Need unsigned int
  2003-01-20 19:05 [Caml-list] Need unsigned int Christoph Bauer
  2003-01-20 20:58 ` Sven Luther
@ 2003-01-22 14:55 ` Nicolas Cannasse
  2003-01-23 15:00   ` Damien Doligez
  1 sibling, 1 reply; 6+ messages in thread
From: Nicolas Cannasse @ 2003-01-22 14:55 UTC (permalink / raw)
  To: caml-list, Christoph Bauer

> my program need to calculate a hash key of a matrix (with dimension 8
> x 8).  It is necessary that this calculation is very fast, so my
> program will update the hash key after every small modification of the
> matrix. My problem is that the hash key should be an unsigned int
> or an unsigned long in.
>
> My problem occurs here (Mersenne prime number 2^31-1):
> let big_prim = 2147483647
> val big_prim : int = -1

OCaml does not of unsigned integers.
Using Int64 or Bignum modules as Sven suggested you would be a threat to
your program performances since it involves boxing.

BTW, why do care about the integer sign ?
Only the printer show you -1, but the hardware representation, taking note
that OCaml int are 31 bits, doesn't change between signed and unsigned, does
it ? The only main difference I see is when comparing two signed integers.
Then perhaps something like :

let ui_compare x y =
    x lsr 16 < y lsr 16 || x land 0xFFFF < y land 0xFFFF

Is what you need.

ui_compare 1 2;; // true
ui_compare (-1) 2;; // false

Nicolas Cannasse

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] Need unsigned int
  2003-01-22 14:55 ` Nicolas Cannasse
@ 2003-01-23 15:00   ` Damien Doligez
  2003-01-24  0:39     ` David Chase
  2003-01-25 13:50     ` Nicolas Cannasse
  0 siblings, 2 replies; 6+ messages in thread
From: Damien Doligez @ 2003-01-23 15:00 UTC (permalink / raw)
  To: caml-list

On Wednesday, January 22, 2003, at 03:55 PM, Nicolas Cannasse wrote:

> let ui_compare x y =
>     x lsr 16 < y lsr 16 || x land 0xFFFF < y land 0xFFFF

Watch out !  This definition is wrong.


> Is what you need.
>
> ui_compare 1 2;; // true
> ui_compare (-1) 2;; // false

ui_compare 65536 1;; // true


-- Damien

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] Need unsigned int
  2003-01-23 15:00   ` Damien Doligez
@ 2003-01-24  0:39     ` David Chase
  2003-01-25 13:50     ` Nicolas Cannasse
  1 sibling, 0 replies; 6+ messages in thread
From: David Chase @ 2003-01-24  0:39 UTC (permalink / raw)
  To: caml-list

My CAML skills are poor, especially on bitwise operations, but
here is how one does (or can do) unsigned in Java:

  public static boolean lessThan(int x, int y) {
    return ((x^y) >= 0) ? (x < y) : (y < x);
  };

That is, if the signs are the same, then signed and
unsigned compares agree.  Otherwise, the negative one
is larger.  Another way to phrase this might be (if
you hate control flow):

  return ((x^y) >>> 31) ^ (x < y);

The reasoning here is that if the signs agree, then
0 XOR any == any.  Otherwise, if the signs disagree,
then x and y are surely not equal, so (y<x) and
(y<=x) serve equally well, but (y<=x) == !(x<y),
which has a subexpression in common with the other
case.

Hope this helps.

David


 

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Caml-list] Need unsigned int
  2003-01-23 15:00   ` Damien Doligez
  2003-01-24  0:39     ` David Chase
@ 2003-01-25 13:50     ` Nicolas Cannasse
  1 sibling, 0 replies; 6+ messages in thread
From: Nicolas Cannasse @ 2003-01-25 13:50 UTC (permalink / raw)
  To: Damien Doligez, caml-list

> > let ui_compare x y =
> >     x lsr 16 < y lsr 16 || x land 0xFFFF < y land 0xFFFF
> 
> Watch out !  This definition is wrong.
> 

My fault !
Sometimes my keyboard is writing faster than my brain is thinking :)

Someting like :

let ui_compare x y =
    match x lsr 16 - y lsr 16 with
    | 0 -> x land 0xFFFF < y land 0xFFFF
    | n when n > 0 -> false
    | _ ->  true

Should be okay

Nicolas Cannasse

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2003-01-25 12:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-01-20 19:05 [Caml-list] Need unsigned int Christoph Bauer
2003-01-20 20:58 ` Sven Luther
2003-01-22 14:55 ` Nicolas Cannasse
2003-01-23 15:00   ` Damien Doligez
2003-01-24  0:39     ` David Chase
2003-01-25 13:50     ` Nicolas Cannasse

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).