caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Runtime overflow and what to do
@ 2002-10-10 15:01 Scott J,
  2002-10-10 15:07 ` Maxence Guesdon
                   ` (3 more replies)
  0 siblings, 4 replies; 38+ messages in thread
From: Scott J, @ 2002-10-10 15:01 UTC (permalink / raw)
  To: caml-list

[-- Attachment #1: Type: text/plain, Size: 370 bytes --]

Hi,


suppose I use the following code for fact

let rec fact n = if n <= 1 then 1 else n * fact (n - 1) ;;

Because an integer number is represented by a fixed number of bytes I will
get a runtime overflow if n is chosen too large.

Is there in Ocamel a workaround to cope with this problem . Something like "
Onoverflow goto .. " in imperative languages.

Thx

Scott


[-- Attachment #2: Type: text/html, Size: 1402 bytes --]

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

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 15:01 [Caml-list] Runtime overflow and what to do Scott J,
@ 2002-10-10 15:07 ` Maxence Guesdon
  2002-10-10 15:11 ` Maxence Guesdon
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 38+ messages in thread
From: Maxence Guesdon @ 2002-10-10 15:07 UTC (permalink / raw)
  To: Scott J,; +Cc: caml-list

On Thu, 10 Oct 2002 17:01:26 +0200
"Scott J," <jscott@planetinternet.be> wrote:

> let rec fact n = if n <= 1 then 1 else n * fact (n - 1) ;;
You can catch the Stack_overflow exception :

try fact 500000
with Stack_overflow -> -1

Is that what you want ?

-- 
Maxence Guesdon
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 15:01 [Caml-list] Runtime overflow and what to do Scott J,
  2002-10-10 15:07 ` Maxence Guesdon
@ 2002-10-10 15:11 ` Maxence Guesdon
  2002-10-10 15:21 ` Luc Maranget
  2002-10-11  6:42 ` Florian Hars
  3 siblings, 0 replies; 38+ messages in thread
From: Maxence Guesdon @ 2002-10-10 15:11 UTC (permalink / raw)
  To: Scott J,; +Cc: caml-list

> 
> suppose I use the following code for fact
> 
> let rec fact n = if n <= 1 then 1 else n * fact (n - 1) ;;
> 
> Because an integer number is represented by a fixed number of bytes I will
> get a runtime overflow if n is chosen too large.
> 
> Is there in Ocamel a workaround to cope with this problem . Something like "
> Onoverflow goto .. " in imperative languages.

Sorry, i replied too fast and did not answer your question, since you don't want to catch stack_overflow but be warned about an overflow during the computation of mult.

I don't know how to do that.

-- 
Maxence Guesdon
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 15:01 [Caml-list] Runtime overflow and what to do Scott J,
  2002-10-10 15:07 ` Maxence Guesdon
  2002-10-10 15:11 ` Maxence Guesdon
@ 2002-10-10 15:21 ` Luc Maranget
  2002-10-10 18:13   ` Sven LUTHER
  2002-10-11  6:42 ` Florian Hars
  3 siblings, 1 reply; 38+ messages in thread
From: Luc Maranget @ 2002-10-10 15:21 UTC (permalink / raw)
  To: Scott J, ; +Cc: caml-list

> Hi,
> 
> 
> suppose I use the following code for fact
> 
> let rec fact n = if n <= 1 then 1 else n * fact (n - 1) ;;
> 
> Because an integer number is represented by a fixed number of bytes I will
> get a runtime overflow if n is chosen too large.
> 
> Is there in Ocamel a workaround to cope with this problem . Something like "
> Onoverflow goto .. " in imperative languages.
> 
> Thx
> 
> Scott
> 
> 

There is no such feature as a Onoverflow goto, because
Ocaml (and not OCamel...) default integers are not << real >> integers,
but machine integers on some size (typically 31 or 63) bits.

This means that maxint + 1 is minint and basically this is the
behavior of C.

I guess the reason why is avoiding putting non-obvious tests
everywhere.

Most of the time you do not need those tests.
  * If you want ``real'' integers, you can use some arbitrary
    precision library (Num, etc.), overflow detection would  not help
    here anyway.

  * If you want to be warned on overflow, you have to devise the tests
    by yourself, and then you can use an exception as your
    Onoverflow goto
     An easy one :

expection Overflow

let protected_incr x =
  let y = x+1 in
  if y > x then y
  else raise Overflow

try
  .... incr (..)
with
| Overflow -> ... do whatever you can ... 

Hope it helps.

--Luc
               

    
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 15:21 ` Luc Maranget
@ 2002-10-10 18:13   ` Sven LUTHER
  2002-10-10 18:57     ` Xavier Leroy
  0 siblings, 1 reply; 38+ messages in thread
From: Sven LUTHER @ 2002-10-10 18:13 UTC (permalink / raw)
  To: Luc Maranget; +Cc: Scott J, , caml-list

On Thu, Oct 10, 2002 at 05:21:13PM +0200, Luc Maranget wrote:
> > Hi,
> > 
> > 
> > suppose I use the following code for fact
> > 
> > let rec fact n = if n <= 1 then 1 else n * fact (n - 1) ;;
> > 
> > Because an integer number is represented by a fixed number of bytes I will
> > get a runtime overflow if n is chosen too large.
> > 
> > Is there in Ocamel a workaround to cope with this problem . Something like "
> > Onoverflow goto .. " in imperative languages.
> > 
> > Thx
> > 
> > Scott
> > 
> > 
> 
> There is no such feature as a Onoverflow goto, because
> Ocaml (and not OCamel...) default integers are not << real >> integers,
> but machine integers on some size (typically 31 or 63) bits.

But it is the lower bit that is ignored, no, si i guess incrementing an
ocaml integer by 1, correspond to incrementing the machine integer by
two, and would set the overflow flag in the processor status register
all the same, would it not ? 

The flag is then ignored, but it is set all the same, at least until it
is overriden by some other calculation.

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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 18:13   ` Sven LUTHER
@ 2002-10-10 18:57     ` Xavier Leroy
  2002-10-10 22:17       ` Scott J,
  2002-10-11  8:02       ` Sven LUTHER
  0 siblings, 2 replies; 38+ messages in thread
From: Xavier Leroy @ 2002-10-10 18:57 UTC (permalink / raw)
  To: Sven LUTHER; +Cc: Luc Maranget, Scott J, , caml-list

> But it is the lower bit that is ignored, no, si i guess incrementing an
> ocaml integer by 1, correspond to incrementing the machine integer by
> two, and would set the overflow flag in the processor status register
> all the same, would it not ? 

Yes, except that not all processors have overflow flags.  The Alpha
and the MIPS don't, for instance.  Integer arithmetic modulo a power
of 2 is unpleasant for certain applications (and very useful for
others, e.g. hash functions and cryptography), but this is really all
what today's processors offer.

- Xavier Leroy
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 18:57     ` Xavier Leroy
@ 2002-10-10 22:17       ` Scott J,
  2002-10-11  8:00         ` Sven LUTHER
                           ` (2 more replies)
  2002-10-11  8:02       ` Sven LUTHER
  1 sibling, 3 replies; 38+ messages in thread
From: Scott J, @ 2002-10-10 22:17 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: caml-list

[-- Attachment #1: Type: text/plain, Size: 1051 bytes --]

Hi,

So it is not easy, perhaps even impossible if the processor doesn't set a
flag .

e.g. fact n begins first with a lis of negative numbers (after overflow)
then comes again a list with positive numbers and then it remains = 0

Scott
  ----- Original Message -----
  From: Xavier Leroy
  To: Sven LUTHER
  Cc: Luc Maranget ; Scott J, ; caml-list@inria.fr
  Sent: Thursday, October 10, 2002 8:57 PM
  Subject: Re: [Caml-list] Runtime overflow and what to do


  > But it is the lower bit that is ignored, no, si i guess incrementing an
  > ocaml integer by 1, correspond to incrementing the machine integer by
  > two, and would set the overflow flag in the processor status register
  > all the same, would it not ?

  Yes, except that not all processors have overflow flags.  The Alpha
  and the MIPS don't, for instance.  Integer arithmetic modulo a power
  of 2 is unpleasant for certain applications (and very useful for
  others, e.g. hash functions and cryptography), but this is really all
  what today's processors offer.

  - Xavier Leroy

[-- Attachment #2: Type: text/html, Size: 2583 bytes --]

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

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 15:01 [Caml-list] Runtime overflow and what to do Scott J,
                   ` (2 preceding siblings ...)
  2002-10-10 15:21 ` Luc Maranget
@ 2002-10-11  6:42 ` Florian Hars
  3 siblings, 0 replies; 38+ messages in thread
From: Florian Hars @ 2002-10-11  6:42 UTC (permalink / raw)
  To: Scott J,; +Cc: caml-list

Scott J, wrote:
> Because an integer number is represented by a fixed number of bytes I 
> will get a runtime overflow if n is chosen too large.

You have to check explicitly:

# exception Overflow;;
exception Overflow
# let fact n =
    let rec fact_r acc n =
     if n = 1 then acc
     else if max_int / acc > (n-1) then fact_r (acc * n) (n - 1)
     else raise Overflow
    in
    fact_r 1 n;;
val fact : int -> int = <fun>
# fact 12;;
- : int = 479001600
# fact 13;;
Exception: Overflow.

Yours, Florian

-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 22:17       ` Scott J,
@ 2002-10-11  8:00         ` Sven LUTHER
  2002-10-11 10:16         ` Alessandro Baretta
  2002-10-13  9:25         ` [Caml-list] Runtime overflow and what to do Xavier Leroy
  2 siblings, 0 replies; 38+ messages in thread
From: Sven LUTHER @ 2002-10-11  8:00 UTC (permalink / raw)
  To: Scott J,; +Cc: Xavier Leroy, caml-list

On Fri, Oct 11, 2002 at 12:17:15AM +0200, Scott J, wrote:
> Hi,
> 
> So it is not easy, perhaps even impossible if the processor doesn't set a
> flag .
> 
> e.g. fact n begins first with a lis of negative numbers (after overflow)
> then comes again a list with positive numbers and then it remains = 0

No, it is easy, but you have to check at each iteration, as was proposed
here previously.

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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 18:57     ` Xavier Leroy
  2002-10-10 22:17       ` Scott J,
@ 2002-10-11  8:02       ` Sven LUTHER
  1 sibling, 0 replies; 38+ messages in thread
From: Sven LUTHER @ 2002-10-11  8:02 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: Sven LUTHER, Luc Maranget, Scott J, , caml-list

On Thu, Oct 10, 2002 at 08:57:16PM +0200, Xavier Leroy wrote:
> > But it is the lower bit that is ignored, no, si i guess incrementing an
> > ocaml integer by 1, correspond to incrementing the machine integer by
> > two, and would set the overflow flag in the processor status register
> > all the same, would it not ? 
> 
> Yes, except that not all processors have overflow flags.  The Alpha
> and the MIPS don't, for instance.  Integer arithmetic modulo a power

Didn't know that. (Mostly i know about powerpc and M68K assembly only).

Mmm, Is that why these processors are faster on number crunshing ? Or
better said, a consequence of designing these processors fro being fast
at number crunshing ?

> of 2 is unpleasant for certain applications (and very useful for
> others, e.g. hash functions and cryptography), but this is really all
> what today's processors offer.

Did you ever got hand on a MAJC processor, which supposedly has an extra
bit for GC purpose, or something such ?

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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 22:17       ` Scott J,
  2002-10-11  8:00         ` Sven LUTHER
@ 2002-10-11 10:16         ` Alessandro Baretta
  2002-10-12 16:13           ` John Carr
  2002-10-13  9:25         ` [Caml-list] Runtime overflow and what to do Xavier Leroy
  2 siblings, 1 reply; 38+ messages in thread
From: Alessandro Baretta @ 2002-10-11 10:16 UTC (permalink / raw)
  To: Scott J,, Ocaml



Scott J, wrote:
> Hi,
>  
> So it is not easy, perhaps even impossible if the processor doesn't set 
> a flag .
>  
> e.g. fact n begins first with a lis of negative numbers (after overflow) 
> then comes again a list with positive numbers and then it remains = 0
>  
> Scott

If your problem is only the factorial function, then you can 
calculate statically (i.e. at source-code writing time) the 
value of the maximum integer whose factorial will fit in 
O'Caml's representation of integers, and test against that, 
once and for all, before entering the recursive calculation.

exception overflow
let max_fact_arg = ...

let fact =
let rec rec_fact n =
   if n <= 0 then 1
   else n * rec_fact (n-1)
in function
| x when x <= max_fact_arg -> rec_fact n
| _ -> raise Overflow

This strategy allows to incur in hardly any runtime costs 
for the check, and it also allows you prove more easily that 
your program will not raise runtime Overflow exceptions (the 
precondition for not entering the exception raising branch 
does not have to be propagated out of a recursive function 
call).

Alex

-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-11 10:16         ` Alessandro Baretta
@ 2002-10-12 16:13           ` John Carr
  2002-10-12 16:58             ` Sven LUTHER
  2002-10-13  9:28             ` Xavier Leroy
  0 siblings, 2 replies; 38+ messages in thread
From: John Carr @ 2002-10-12 16:13 UTC (permalink / raw)
  To: Alessandro Baretta; +Cc: Ocaml


> If your problem is only the factorial function, then you can 
> calculate statically (i.e. at source-code writing time) the 
> value of the maximum integer whose factorial will fit in 
> O'Caml's representation of integers, and test against that, 
> once and for all, before entering the recursive calculation.

OCaml supports 32 and 64 bit integers.  Is it possible to detect at
compile time the size of the maximum integer?

In the case of factorial, you could almost as easily optimize the
function to a table lookup.

-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-12 16:13           ` John Carr
@ 2002-10-12 16:58             ` Sven LUTHER
  2002-10-12 17:12               ` John Prevost
  2002-10-13  9:31               ` Xavier Leroy
  2002-10-13  9:28             ` Xavier Leroy
  1 sibling, 2 replies; 38+ messages in thread
From: Sven LUTHER @ 2002-10-12 16:58 UTC (permalink / raw)
  To: John Carr; +Cc: Alessandro Baretta, Ocaml

On Sat, Oct 12, 2002 at 12:13:32PM -0400, John Carr wrote:
> 
> > If your problem is only the factorial function, then you can 
> > calculate statically (i.e. at source-code writing time) the 
> > value of the maximum integer whose factorial will fit in 
> > O'Caml's representation of integers, and test against that, 
> > once and for all, before entering the recursive calculation.
> 
> OCaml supports 32 and 64 bit integers.  Is it possible to detect at
> compile time the size of the maximum integer?

val max_int : int

   The greatest representable integer.

Says the doc.

BTW, i compile the sparc debian package on a sparc64 box which
advertizes as a sparc box. Will i get access to the 64 bit integers in
this case or not ?

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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-12 16:58             ` Sven LUTHER
@ 2002-10-12 17:12               ` John Prevost
  2002-10-13  9:31               ` Xavier Leroy
  1 sibling, 0 replies; 38+ messages in thread
From: John Prevost @ 2002-10-12 17:12 UTC (permalink / raw)
  To: Sven LUTHER; +Cc: John Carr, Alessandro Baretta, Ocaml

>>>>> "sl" == Sven LUTHER <luther@dpt-info.u-strasbg.fr> writes:

    sl> On Sat, Oct 12, 2002 at 12:13:32PM -0400, John Carr wrote:

    >> OCaml supports 32 and 64 bit integers.  Is it possible to
    >> detect at compile time the size of the maximum integer?

    sl> val max_int : int

    sl>    The greatest representable integer.

But that's at runtime.  Which, actually, is the best you can
do--bytecode compiled things might run on any architecture.  Native
compiled things you can rely on more.  But if you want to compile this
knowledge in, you'll have to have some configure script that
determines the word size and chooses which version to compile.

John.

-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-10 22:17       ` Scott J,
  2002-10-11  8:00         ` Sven LUTHER
  2002-10-11 10:16         ` Alessandro Baretta
@ 2002-10-13  9:25         ` Xavier Leroy
  2002-10-13 10:04           ` Daniel de Rauglaudre
  2002-10-13 10:19           ` Pierre Weis
  2 siblings, 2 replies; 38+ messages in thread
From: Xavier Leroy @ 2002-10-13  9:25 UTC (permalink / raw)
  To: Scott J,; +Cc: caml-list

> So it is not easy, perhaps even impossible if the processor doesn't set a
> flag .

It is possible, but slow and not pretty!  For example, here is Caml
code that performs integer addition and detects overflows:

exception Integer_overflow

let no_overflow_add a b = 
  if (a lxor b) lor (a lxor (lnot (a+b))) < 0  (* no kidding! *)
  then a + b
  else raise Integer_overflow

Multiplication is left as an exercise for the readers :-)

My advice would be to use bignums; they are a bit slower, but at least
you get the exact result in all cases.

- Xavier Leroy
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-12 16:13           ` John Carr
  2002-10-12 16:58             ` Sven LUTHER
@ 2002-10-13  9:28             ` Xavier Leroy
  2002-10-14  0:56               ` Chris Hecker
  1 sibling, 1 reply; 38+ messages in thread
From: Xavier Leroy @ 2002-10-13  9:28 UTC (permalink / raw)
  To: John Carr; +Cc: Alessandro Baretta, Ocaml

> OCaml supports 32 and 64 bit integers.  Is it possible to detect at
> compile time the size of the maximum integer?

What about:

        echo "print_int Sys.word_size" > /tmp/caml$$
        WORDSIZE=`ocaml /tmp/caml$$`
        rm -f /tmp/caml$$

WORDSIZE will be set to 32 or 64, depending on the platform.

- Xavier Leroy
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-12 16:58             ` Sven LUTHER
  2002-10-12 17:12               ` John Prevost
@ 2002-10-13  9:31               ` Xavier Leroy
  2002-10-13  9:52                 ` Sven LUTHER
  1 sibling, 1 reply; 38+ messages in thread
From: Xavier Leroy @ 2002-10-13  9:31 UTC (permalink / raw)
  To: Sven LUTHER; +Cc: John Carr, Alessandro Baretta, Ocaml

> BTW, i compile the sparc debian package on a sparc64 box which
> advertizes as a sparc box. Will i get access to the 64 bit integers in
> this case or not ?

The short answer is: it depends on the C compiler.  Caml integers
correspond to the C "long int" type, with one bit reserved for GC
purposes.  So, if the C compiler maps "long int" to 64-bit integers,
you get 63-bit Caml ints; if it chooses 32-bit integers for "long int",
you get 31-bit Caml ints.  Often, this can be controlled via flags to
the C compiler.

The above is for the bytecode interpreter.  For the native-code
compiler, the current Sparc code emitter mandates 32-bit integers.

- Xavier Leroy
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13  9:31               ` Xavier Leroy
@ 2002-10-13  9:52                 ` Sven LUTHER
  2002-10-13  9:57                   ` Xavier Leroy
  2002-10-13 13:25                   ` John Carr
  0 siblings, 2 replies; 38+ messages in thread
From: Sven LUTHER @ 2002-10-13  9:52 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: Sven LUTHER, John Carr, Alessandro Baretta, Ocaml

On Sun, Oct 13, 2002 at 11:31:30AM +0200, Xavier Leroy wrote:
> > BTW, i compile the sparc debian package on a sparc64 box which
> > advertizes as a sparc box. Will i get access to the 64 bit integers in
> > this case or not ?
> 
> The short answer is: it depends on the C compiler.  Caml integers
> correspond to the C "long int" type, with one bit reserved for GC
> purposes.  So, if the C compiler maps "long int" to 64-bit integers,
> you get 63-bit Caml ints; if it chooses 32-bit integers for "long int",
> you get 31-bit Caml ints.  Often, this can be controlled via flags to
> the C compiler.

Ok, ...

Which would be the relevant flags ?

i get (from the build log) :

...

Checking the sizes of integers and pointers...
OK, this is a regular 32 bit architecture.
64-bit "long long" integer type found (printf with "%ll").
This is a big-endian architecture.
Doubles must be doubleword-aligned.
64-bit integers must be doubleword-aligned.

...

Configuration for the bytecode compiler:
        C compiler used........... gcc
        options for compiling..... -fno-defer-pop -Wall -Wno-unused -D_FILE_OFFSET_BITS=64 -D_REENTRANT
        options for linking.......  -Wl,-E  -lm -ldl -lcurses -lpthread
        shared libraries are supported
        options for compiling..... -fPIC -fno-defer-pop -Wall -Wno-unused -D_FILE_OFFSET_BITS=64 -D_REENTRANT
        command for building...... gcc -shared -o lib.so -Wl,-rpath,/a/path objs

So i suppose this is not using 64 bit mode.

More importantly, i suppose code compiled in this fashion for 64 bit
sparcs will not build on 32 bit sparc boxes, if these kind of boxes are
still available anyway.

> The above is for the bytecode interpreter.  For the native-code
> compiler, the current Sparc code emitter mandates 32-bit integers.

Would it be much work to build a 64-bit integers target ?

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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13  9:52                 ` Sven LUTHER
@ 2002-10-13  9:57                   ` Xavier Leroy
  2002-10-13 10:15                     ` Sven LUTHER
  2002-10-13 13:25                   ` John Carr
  1 sibling, 1 reply; 38+ messages in thread
From: Xavier Leroy @ 2002-10-13  9:57 UTC (permalink / raw)
  To: Sven LUTHER; +Cc: caml-list

> Which would be the relevant flags ?

No idea.  If you're interested, you figure them out :-)

> More importantly, i suppose code compiled in this fashion for 64 bit
> sparcs will not build on 32 bit sparc boxes, if these kind of boxes are
> still available anyway.

Yes (to both).  I still don't have access to a 64-bit SPARC machine.

> > The above is for the bytecode interpreter.  For the native-code
> > compiler, the current Sparc code emitter mandates 32-bit integers.
> 
> Would it be much work to build a 64-bit integers target ?

A few days for someone who knows the SPARC64 assembly language well.

- Xavier Leroy
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13  9:25         ` [Caml-list] Runtime overflow and what to do Xavier Leroy
@ 2002-10-13 10:04           ` Daniel de Rauglaudre
  2002-10-13 10:29             ` Pierre Weis
  2002-10-13 10:19           ` Pierre Weis
  1 sibling, 1 reply; 38+ messages in thread
From: Daniel de Rauglaudre @ 2002-10-13 10:04 UTC (permalink / raw)
  To: caml-list

Hi,

On Sun, Oct 13, 2002 at 11:25:37AM +0200, Xavier Leroy wrote:

> Multiplication is left as an exercise for the readers :-)

Much more complicated... I tried that a long time ago when I was
writting a PostScript interpreter, but I found no solution.

-- 
Daniel de RAUGLAUDRE
daniel.de_rauglaudre@inria.fr
http://cristal.inria.fr/~ddr/
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13  9:57                   ` Xavier Leroy
@ 2002-10-13 10:15                     ` Sven LUTHER
  0 siblings, 0 replies; 38+ messages in thread
From: Sven LUTHER @ 2002-10-13 10:15 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: Sven LUTHER, caml-list

On Sun, Oct 13, 2002 at 11:57:25AM +0200, Xavier Leroy wrote:
> > Which would be the relevant flags ?
> 
> No idea.  If you're interested, you figure them out :-)

Ok, ...

Still i have difficulties understanding how this work, in my idea
bytecode was build once run everywhere, how does this go with your
statement that it can be made to use 64bit integers by a compiler
switch ?

Mmm, maybe you are speaking about ocamlrun only ?

> > More importantly, i suppose code compiled in this fashion for 64 bit
> > sparcs will not build on 32 bit sparc boxes, if these kind of boxes are
> > still available anyway.
> 
> Yes (to both).  I still don't have access to a 64-bit SPARC machine.

Do you want access ? I can try to arrange that if you want. To an hppa
machine also.

> > > The above is for the bytecode interpreter.  For the native-code
> > > compiler, the current Sparc code emitter mandates 32-bit integers.
> > 
> > Would it be much work to build a 64-bit integers target ?
> 
> A few days for someone who knows the SPARC64 assembly language well.

Ok, ...

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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13  9:25         ` [Caml-list] Runtime overflow and what to do Xavier Leroy
  2002-10-13 10:04           ` Daniel de Rauglaudre
@ 2002-10-13 10:19           ` Pierre Weis
  1 sibling, 0 replies; 38+ messages in thread
From: Pierre Weis @ 2002-10-13 10:19 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: jscott, caml-list

> > So it is not easy, perhaps even impossible if the processor doesn't set a
> > flag .
> 
> It is possible, but slow and not pretty!

I must precise that even if the code to implement arithmetics with
overflow checks can be considered as ``not pretty'', its usage is
absolutely easy and transparent in Caml: just write a specialized
module for arithmetics with overflow checks (say ``Cautious_arith'')
that redefines ( + ), ( - ), ( * ), ( / ), min, etc, along the lines
sketched by Xavier for addition (by the way, writing such a module is
a very pleasant home exercise); once you have written the
Cautious_arith module, write your application code as usual.

Now, if you want overflow checks just add

open Cautious_arith

at the beginning of your module and recompile.

If you changed your mind, and want to recover the normal speed of
integer arithmetic operations, just remove the open directive and
recompile!

This is an elegant and clean application of very basic operators
redefinition that not so many programming languages offer.

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/


-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13 10:04           ` Daniel de Rauglaudre
@ 2002-10-13 10:29             ` Pierre Weis
  2002-10-13 10:47               ` Daniel de Rauglaudre
  2002-10-13 16:14               ` Xavier Leroy
  0 siblings, 2 replies; 38+ messages in thread
From: Pierre Weis @ 2002-10-13 10:29 UTC (permalink / raw)
  To: Daniel de Rauglaudre; +Cc: caml-list

> Hi,
> 
> On Sun, Oct 13, 2002 at 11:25:37AM +0200, Xavier Leroy wrote:
> 
> > Multiplication is left as an exercise for the readers :-)
> 
> Much more complicated... I tried that a long time ago when I was
> writting a PostScript interpreter, but I found no solution.

(* [lenght_of_int] is the maximum number of bits in an integer. *)
let length_of_int = Sys.word_size - 2;;

let ( * ) n m =
 if num_bits_int n + num_bits_int m < length_of_int
 then n * m else raise (Overflow ("*", string_of_int n, string_of_int m))

(* [num_bits_int n] returns the number of significant bits of an
   integer. *)

Just to let people play with the writting of the module :),
num_bits_int is left as an exercise to the interested readers (3 lines
of Caml code using trivial bit shuffling).

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/


-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13 10:29             ` Pierre Weis
@ 2002-10-13 10:47               ` Daniel de Rauglaudre
  2002-10-13 12:38                 ` Pierre Weis
  2002-10-13 16:14               ` Xavier Leroy
  1 sibling, 1 reply; 38+ messages in thread
From: Daniel de Rauglaudre @ 2002-10-13 10:47 UTC (permalink / raw)
  To: caml-list

Hi,

On Sun, Oct 13, 2002 at 12:29:58PM +0200, Pierre Weis wrote:

> let ( * ) n m =
>  if num_bits_int n + num_bits_int m < length_of_int
>  then n * m else raise (Overflow ("*", string_of_int n, string_of_int m))

Does it work with negative numbers? And with multiplication between a
positive and a negative number?

> Just to let people play with the writting of the module :),
> num_bits_int is left as an exercise to the interested readers (3 lines
> of Caml code using trivial bit shuffling).

I am interested in knowing it, because I already searched that.
Without a loop or a predefined array of powers of two, I don't
know how to do that.

-- 
Daniel de RAUGLAUDRE
daniel.de_rauglaudre@inria.fr
http://cristal.inria.fr/~ddr/
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13 10:47               ` Daniel de Rauglaudre
@ 2002-10-13 12:38                 ` Pierre Weis
  0 siblings, 0 replies; 38+ messages in thread
From: Pierre Weis @ 2002-10-13 12:38 UTC (permalink / raw)
  To: Daniel de Rauglaudre; +Cc: caml-list

Hi again,

> On Sun, Oct 13, 2002 at 12:29:58PM +0200, Pierre Weis wrote:
> 
> > let ( * ) n m =
> >  if num_bits_int n + num_bits_int m < length_of_int
> >  then n * m else raise (Overflow ("*", string_of_int n, string_of_int m))
> 
> Does it work with negative numbers? And with multiplication between a
> positive and a negative number?

Yes it does.

> > Just to let people play with the writting of the module :),
> > num_bits_int is left as an exercise to the interested readers (3 lines
> > of Caml code using trivial bit shuffling).
> 
> I am interested in knowing it, because I already searched that.
> Without a loop or a predefined array of powers of two, I don't
> know how to do that.

Nor did I. I think there exists processors that do have an instruction
to implement this function but this is not the general case: you need
to write a loop or use a predefined array of powers of two or write a
dichotomic algorithm or whatever...

For instance:

let num_bits_int n =
  let rec num_bits n = if n = 0 then 0 else succ (num_bits (n lsr 1)) in
  num_bits (abs n);;

(No dichotomy, here. Experiments with a dichotomic algorithm is also
interesting, but deciding which is faster is difficult since
benchmarking is almost impossible: the results are too much dependant
of the value of integers manipulated in the program.)

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/


-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13  9:52                 ` Sven LUTHER
  2002-10-13  9:57                   ` Xavier Leroy
@ 2002-10-13 13:25                   ` John Carr
  1 sibling, 0 replies; 38+ messages in thread
From: John Carr @ 2002-10-13 13:25 UTC (permalink / raw)
  To: Sven LUTHER; +Cc: Ocaml


>Would it be much work to build a 64-bit integers target ?

Try http://www.mit.edu/~jfc/ocaml-sparc64.tar.gz
This tar file contains diffs and new code generation
files for 64 bit SPARC.  You will need to apply the
.diff files with patch and move the other files into
the appropriate directories (replacing the existing
files without the "64" suffix), and probably do some
editing of config/Makefile.  I have not tested this
on Linux.  Contact me if you need help.

If there is a lot of interest I can try to package this
in a more immediately useful form.  I stopped work on
the 64 bit code generator before finishing the packaging.

A note of caution: 64 bits is not necessarily better than 32.
Unlike C, OCaml does not allow you to declare a 32 bit object
in 64 bit mode, so memory use will approximately double.
Performance executing out of cache will improve slightly,
or significantly when using floating point, but the increased
cache miss rate may make the program slower overall.

-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13 10:29             ` Pierre Weis
  2002-10-13 10:47               ` Daniel de Rauglaudre
@ 2002-10-13 16:14               ` Xavier Leroy
  2002-10-13 17:06                 ` Michel Quercia
  2002-10-15 19:15                 ` Pierre Weis
  1 sibling, 2 replies; 38+ messages in thread
From: Xavier Leroy @ 2002-10-13 16:14 UTC (permalink / raw)
  To: Pierre Weis; +Cc: Daniel de Rauglaudre, caml-list

> [Overflow checking in integer multiplication]

> (* [lenght_of_int] is the maximum number of bits in an integer. *)
> let length_of_int = Sys.word_size - 2;;
> 
> let ( * ) n m =
>  if num_bits_int n + num_bits_int m < length_of_int
>  then n * m else raise (Overflow ("*", string_of_int n, string_of_int m))
> 
> (* [num_bits_int n] returns the number of significant bits of an
>    integer. *)

Hmmph... this definition raises Overflow when computing
min_int * 1, or (min_int / 2) * 2, while these products are actually
representable within a machine integer...

Apologies for nit-picking; I couldn't resist!

- Xavier Leroy
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13 16:14               ` Xavier Leroy
@ 2002-10-13 17:06                 ` Michel Quercia
  2002-10-15 19:15                 ` Pierre Weis
  1 sibling, 0 replies; 38+ messages in thread
From: Michel Quercia @ 2002-10-13 17:06 UTC (permalink / raw)
  To: caml-list

Le Dimanche 13 Octobre 2002 18:14, Xavier Leroy a écrit :

> > [Overflow checking in integer multiplication]
> > let ( * ) n m =
> >  if num_bits_int n + num_bits_int m < length_of_int
> >  then n * m else raise (Overflow ("*", string_of_int n, string_of_int m))
> Hmmph... this definition raises Overflow when computing
> min_int * 1, or (min_int / 2) * 2, while these products are actually
> representable within a machine integer...

What about this one ?

let mul a b =
  if a = 0 then 0
  else
    let x = a*b in
    let q = x/a and r = x mod a in
    if (q = b) & (r = 0) then x else raise Overflow


-- 
Michel Quercia
23 rue de Montchapet, 21000 Dijon
http://michel.quercia.free.fr (maths)
http://pauillac.inria.fr/~quercia (informatique)
mailto:michel.quercia@prepas.org

-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13  9:28             ` Xavier Leroy
@ 2002-10-14  0:56               ` Chris Hecker
  2002-10-14  9:46                 ` Jacques Garrigue
  0 siblings, 1 reply; 38+ messages in thread
From: Chris Hecker @ 2002-10-14  0:56 UTC (permalink / raw)
  To: Xavier Leroy, John Carr; +Cc: Alessandro Baretta, Ocaml


>        echo "print_int Sys.word_size" > /tmp/caml$$
>         WORDSIZE=`ocaml /tmp/caml$$`
>         rm -f /tmp/caml$$

We clearly need a "-eval" switch to ocaml, like perl's -e/n/p.  :)

Chris

  

-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-14  0:56               ` Chris Hecker
@ 2002-10-14  9:46                 ` Jacques Garrigue
  2002-10-14 11:02                   ` Scott J,
                                     ` (2 more replies)
  0 siblings, 3 replies; 38+ messages in thread
From: Jacques Garrigue @ 2002-10-14  9:46 UTC (permalink / raw)
  To: checker; +Cc: caml-list

From: Chris Hecker <checker@d6.com>
> >        echo "print_int Sys.word_size" > /tmp/caml$$
> >         WORDSIZE=`ocaml /tmp/caml$$`
> >         rm -f /tmp/caml$$
> 
> We clearly need a "-eval" switch to ocaml, like perl's -e/n/p.  :)

The above can be reduced to one line, without temporary file.
In fact, I feel more like we would need a "-silent" option, to get rid
of prompts and types (this is already the default with scripts).

echo "print_int Sys.word_size;;" | \
ocaml | grep "^# ." | sed -e "s/# //" -e "s/- :.*//"

A shorter but more specific approach is

echo "Sys.word_size;;" | ocaml | grep "# -" | sed -e "s/.*= //"

Jacques Garrigue
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-14  9:46                 ` Jacques Garrigue
@ 2002-10-14 11:02                   ` Scott J,
  2002-10-14 14:05                   ` Tim Freeman
  2002-10-14 16:49                   ` [Caml-list] new ocaml switches (was Re: Runtime overflow and what to do) Chris Hecker
  2 siblings, 0 replies; 38+ messages in thread
From: Scott J, @ 2002-10-14 11:02 UTC (permalink / raw)
  To: Jacques Garrigue; +Cc: caml-list

[-- Attachment #1: Type: text/plain, Size: 1380 bytes --]

Hi,

I am following the discussion. But do not understand this. Is this a
solution to eliminate overhead in integer arithmetic.

Personnally I thought to try to capture the overflow status flag for the
pentium processor on my Windows XP.

Thx

Scott
  ----- Original Message -----
  From: Jacques Garrigue
  To: checker@d6.com
  Cc: caml-list@inria.fr
  Sent: Monday, October 14, 2002 11:46 AM
  Subject: Re: [Caml-list] Runtime overflow and what to do


  From: Chris Hecker <checker@d6.com>
  > >        echo "print_int Sys.word_size" > /tmp/caml$$
  > >         WORDSIZE=`ocaml /tmp/caml$$`
  > >         rm -f /tmp/caml$$
  >
  > We clearly need a "-eval" switch to ocaml, like perl's -e/n/p.  :)

  The above can be reduced to one line, without temporary file.
  In fact, I feel more like we would need a "-silent" option, to get rid
  of prompts and types (this is already the default with scripts).

  echo "print_int Sys.word_size;;" | \
  ocaml | grep "^# ." | sed -e "s/# //" -e "s/- :.*//"

  A shorter but more specific approach is

  echo "Sys.word_size;;" | ocaml | grep "# -" | sed -e "s/.*= //"

  Jacques Garrigue
  -------------------
  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

[-- Attachment #2: Type: text/html, Size: 3300 bytes --]

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

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-14  9:46                 ` Jacques Garrigue
  2002-10-14 11:02                   ` Scott J,
@ 2002-10-14 14:05                   ` Tim Freeman
  2002-10-14 15:32                     ` Stefano Zacchiroli
  2002-10-14 16:49                   ` [Caml-list] new ocaml switches (was Re: Runtime overflow and what to do) Chris Hecker
  2 siblings, 1 reply; 38+ messages in thread
From: Tim Freeman @ 2002-10-14 14:05 UTC (permalink / raw)
  To: garrigue; +Cc: checker, caml-list

From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
>The above can be reduced to one line, without temporary file.
>In fact, I feel more like we would need a "-silent" option, to get rid
>of prompts and types (this is already the default with scripts).
>
>echo "print_int Sys.word_size;;" | \
>ocaml | grep "^# ." | sed -e "s/# //" -e "s/- :.*//"

The following is simpler and works on Unix systems that have /dev/fd:

   echo "print_int Sys.word_size;;" | ocaml /dev/fd/0

I agree that a "-silent" option would be prettier than this, and it
would work on systems that don't have /dev/fd.

-- 
Tim Freeman       
tim@fungible.com
GPG public key fingerprint ECDF 46F8 3B80 BB9E 575D  7180 76DF FE00 34B1 5C78 
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-14 14:05                   ` Tim Freeman
@ 2002-10-14 15:32                     ` Stefano Zacchiroli
  2002-10-14 16:12                       ` Alain Frisch
  0 siblings, 1 reply; 38+ messages in thread
From: Stefano Zacchiroli @ 2002-10-14 15:32 UTC (permalink / raw)
  To: caml-list

On Mon, Oct 14, 2002 at 07:05:57AM -0700, Tim Freeman wrote:
>    echo "print_int Sys.word_size;;" | ocaml /dev/fd/0

Cool! Could you explain the trick?

If I understood correctly /dev/fd/x is a pointer to /proc/self/fd/x, so
the ocaml process try to read the script from /proc/self/fd/0 that is
its standard input i.e. the output of the echo command.

But why the standard ocaml toplevel message wont be printed?

TIA,
Cheers.

-- 
Stefano Zacchiroli - undergraduate student of CS @ Univ. Bologna, Italy
zack@cs.unibo.it | ICQ# 33538863 | http://www.cs.unibo.it/~zacchiro
"I know you believe you understood what you think I said, but I am not
sure you realize that what you heard is not what I meant!" -- G.Romney
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-14 15:32                     ` Stefano Zacchiroli
@ 2002-10-14 16:12                       ` Alain Frisch
  0 siblings, 0 replies; 38+ messages in thread
From: Alain Frisch @ 2002-10-14 16:12 UTC (permalink / raw)
  To: Stefano Zacchiroli; +Cc: caml-list

On Mon, 14 Oct 2002, Stefano Zacchiroli wrote:

> >    echo "print_int Sys.word_size;;" | ocaml /dev/fd/0
>
> But why the standard ocaml toplevel message wont be printed?

Because the ocaml toplevel is quiet when it evaluates a script
whose name is given on its command line.

-- Alain

-------------------
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] 38+ messages in thread

* [Caml-list] new ocaml switches (was Re: Runtime overflow and what to do)
  2002-10-14  9:46                 ` Jacques Garrigue
  2002-10-14 11:02                   ` Scott J,
  2002-10-14 14:05                   ` Tim Freeman
@ 2002-10-14 16:49                   ` Chris Hecker
  2 siblings, 0 replies; 38+ messages in thread
From: Chris Hecker @ 2002-10-14 16:49 UTC (permalink / raw)
  To: Jacques Garrigue; +Cc: caml-list


>The above can be reduced to one line, without temporary file.
>In fact, I feel more like we would need a "-silent" option, to get rid
>of prompts and types (this is already the default with scripts).

Yes, I agree with -silent too!  The only problem with using the pipe for 
everything is that Win2k's echo passes the quotes along to ocaml, so you need:

echo Sys.word_size | ocaml

Sadly, this means you'll need different commands on unix versus nt.  -eval 
would avoid that problem to a large extent, except in that case quoting 
inside a string is different between the two systems, so you're stil kind 
of hosed.  We probably need all of these switches!

Would -silent not print anything that wasn't "printed" from the script, or 
would it only print the types?  Maybe we need -Q for printing nothing 
(script must print to stdout), -qq for printing only values, and -q for 
printing types and values.  Or something.  And -e[val] for evaluating a 
string (should support multiple of them on a single command like perl does, 
which is handy).  Not sure if there are equivalents for perl -n & -p that 
we'd want...ocaml is a bit heavy for quick scripting like this, so -eval 
might be enough.

Chris

-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-13 16:14               ` Xavier Leroy
  2002-10-13 17:06                 ` Michel Quercia
@ 2002-10-15 19:15                 ` Pierre Weis
  2002-10-15 19:25                   ` Xavier Leroy
  1 sibling, 1 reply; 38+ messages in thread
From: Pierre Weis @ 2002-10-15 19:15 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: pierre.weis, daniel.de_rauglaudre, caml-list

> > [Overflow checking in integer multiplication]
> 
> > (* [lenght_of_int] is the maximum number of bits in an integer. *)
> > let length_of_int = Sys.word_size - 2;;
> > 
> > let ( * ) n m =
> >  if num_bits_int n + num_bits_int m < length_of_int
> >  then n * m else raise (Overflow ("*", string_of_int n, string_of_int m))
> > 
> > (* [num_bits_int n] returns the number of significant bits of an
> >    integer. *)
> 
> Hmmph... this definition raises Overflow when computing
> min_int * 1, or (min_int / 2) * 2, while these products are actually
> representable within a machine integer...
> 
> Apologies for nit-picking; I couldn't resist!
> 
> - Xavier Leroy

Well spotted, thank you very much!

As a reward, note that your overflow test on addition raises overflow
when computing (max_int + 1) - 1, while this sum is actually
representable within a machine integer...

Sure, computer arithmetics is tricky!

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/


-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-15 19:15                 ` Pierre Weis
@ 2002-10-15 19:25                   ` Xavier Leroy
  2002-10-16  8:24                     ` Pierre Weis
  0 siblings, 1 reply; 38+ messages in thread
From: Xavier Leroy @ 2002-10-15 19:25 UTC (permalink / raw)
  To: Pierre Weis; +Cc: caml-list

> As a reward, note that your overflow test on addition raises overflow
> when computing (max_int + 1) - 1, while this sum is actually
> representable within a machine integer...

More nit picking: max_int + 1 isn't representable, and (machine)
addition evaluates it to min_int, which is clearly a case of overflow.

- Xavier Leroy
-------------------
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] 38+ messages in thread

* Re: [Caml-list] Runtime overflow and what to do
  2002-10-15 19:25                   ` Xavier Leroy
@ 2002-10-16  8:24                     ` Pierre Weis
  0 siblings, 0 replies; 38+ messages in thread
From: Pierre Weis @ 2002-10-16  8:24 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: pierre.weis, caml-list

> More nit picking: max_int + 1 isn't representable, and (machine)
> addition evaluates it to min_int, which is clearly a case of overflow.

Oups!

Given that max_int has the intended definition, max_int + 1 is
evidently an overflow ...

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/


-------------------
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] 38+ messages in thread

end of thread, other threads:[~2002-10-16  8:24 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-10 15:01 [Caml-list] Runtime overflow and what to do Scott J,
2002-10-10 15:07 ` Maxence Guesdon
2002-10-10 15:11 ` Maxence Guesdon
2002-10-10 15:21 ` Luc Maranget
2002-10-10 18:13   ` Sven LUTHER
2002-10-10 18:57     ` Xavier Leroy
2002-10-10 22:17       ` Scott J,
2002-10-11  8:00         ` Sven LUTHER
2002-10-11 10:16         ` Alessandro Baretta
2002-10-12 16:13           ` John Carr
2002-10-12 16:58             ` Sven LUTHER
2002-10-12 17:12               ` John Prevost
2002-10-13  9:31               ` Xavier Leroy
2002-10-13  9:52                 ` Sven LUTHER
2002-10-13  9:57                   ` Xavier Leroy
2002-10-13 10:15                     ` Sven LUTHER
2002-10-13 13:25                   ` John Carr
2002-10-13  9:28             ` Xavier Leroy
2002-10-14  0:56               ` Chris Hecker
2002-10-14  9:46                 ` Jacques Garrigue
2002-10-14 11:02                   ` Scott J,
2002-10-14 14:05                   ` Tim Freeman
2002-10-14 15:32                     ` Stefano Zacchiroli
2002-10-14 16:12                       ` Alain Frisch
2002-10-14 16:49                   ` [Caml-list] new ocaml switches (was Re: Runtime overflow and what to do) Chris Hecker
2002-10-13  9:25         ` [Caml-list] Runtime overflow and what to do Xavier Leroy
2002-10-13 10:04           ` Daniel de Rauglaudre
2002-10-13 10:29             ` Pierre Weis
2002-10-13 10:47               ` Daniel de Rauglaudre
2002-10-13 12:38                 ` Pierre Weis
2002-10-13 16:14               ` Xavier Leroy
2002-10-13 17:06                 ` Michel Quercia
2002-10-15 19:15                 ` Pierre Weis
2002-10-15 19:25                   ` Xavier Leroy
2002-10-16  8:24                     ` Pierre Weis
2002-10-13 10:19           ` Pierre Weis
2002-10-11  8:02       ` Sven LUTHER
2002-10-11  6:42 ` Florian Hars

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).