[Haskell-cafe] rounding and undefined behavior

Ian Denhardt ian at zenhack.net
Wed Feb 27 23:06:53 UTC 2019


The relevant bit of the Haskell report:

> 18.1 Signed integer types
>
> This module provides signed integer types of unspecified width (Int)
> and fixed widths (Int8, Int16, Int32 and Int64). All arithmetic is
> performed modulo 2^n, where n is the number of bits in the type.

Link:
https://www.haskell.org/onlinereport/haskell2010/haskellch18.html#x26-22300018

The module 2^n bit is ambiguous to me, but it seems it's just doing 2's
complement, which is what the underlying machine does:

    (maxBound :: Int8) + 1
    -128

The C standard, by contrast, states that the behavior of
signed-arithmetic overflow is *undefined*, which is to say there are
absolutely *NO* constraints on what the compiler can do. Modern
compilers use this fact to assume this will never happen when
optimizing. I actually get different numbers with your C example
depending on what optimization flags I pass to the compiler.

Worth noting, this is a huge source of security vulnerabilities in C &
C++.

-Ian

Quoting Matt Peddie (2019-02-27 17:41:43)
> Hi cafe,
>
> It's been my general impression that when neither Haskell nor C
> defines behavior in a particular situation, the behavior nonetheless
> matches.  I was surprised to observe
>
>     Prelude Data.Int> round  (4294967295 :: Double) :: Int16
>     -1
>
> when
>
>     #include <stdio.h>
>     #include <inttypes.h>
>     int main(void) {
>       double d = 4294967295;
>       int16_t r = (int16_t) d;
>       printf("%"PRId16"\n", r);
>       return 0;
>     }
>
> yields 0 when compiled and run.
>
> As far as I can tell, neither language defines what this result should
> be, so neither is doing anything wrong here.  But I was surprised that
> they differ; does anyone know why Haskell's rounding operation behaves
> the way it does (maybe there is some historical reason)?  Or can
> someone perhaps point me to a standards document I missed that states
> how the language must round out-of-bounds inputs?
>
> Regards
>
> Matt Peddie
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.


More information about the Haskell-Cafe mailing list