Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Pierre Weis <Pierre.Weis@inria.fr>
To: mottl@miss.wu-wien.ac.at (Markus Mottl)
Cc: caml-list@inria.fr
Subject: Re: Bug converting numbers?
Date: Mon, 14 Sep 1998 09:41:21 +0200 (MET DST)	[thread overview]
Message-ID: <199809140741.JAA09810@pauillac.inria.fr> (raw)
In-Reply-To: <199809121222.OAA29992@miss.wu-wien.ac.at> from "Markus Mottl" at Sep 12, 98 02:22:12 pm

> Hello - Bonjour!
> 
> I have encountered unexpected behaviour converting integers to floats:
> 
> # let x = 7.;;
> val x : float = 7
> # let y = float 7;;
> val y : float = 7
> # x == y;;
> - : bool = false
> 
> The internal representation of "7." is obviously different to "float 7".
> Is there some reason to it? This makes it hard to write things like:
> 
> if a_float == float (truncate a_float) ...
> 
> if one wants to check whether a float can actually be represented as
> an integer...

For a more exhaustive discussion on this problem, see the Caml FAQ:
<http://caml.inria.fr/FAQ/FAQ_EXPERT-eng.html#egalite>.

The problem here is that you missed the right equality predicate: you
must use = instead of ==. Remember that == means unicity of
representation, not semantical equality of values. For instance:

# "ok" == "ok";;
- : bool = false

"ok" is not the same object as (another) "ok". In contrast, "ok" is
equal to (any other) "ok":

# "ok" = "ok";; 
- : bool = true

So there is no problem of floating point numbers conversion, since the
same (unexpected ?) behaviour still apply if we remove conversions:

# 1.0 == 1.0;;
- : bool = false

(it means that floats may be allocated and then stored in different memory
locations).

Using = your predicate works fine:

let represented_has_an_integer f = f = float (truncate f);;
val represented_has_an_integer : float -> bool = <fun>

And now:

# represented_has_an_integer 7.0;;
- : bool = true

Remember that the == predicate is not for casual uses: you should know
something about value representations in your Caml system to use it
safely. In doubt, use the regular = predicate.

> français:
> La représentation de "7." et évidemment differente de "float 7".
> Est-ce qu'il y a une raison? C'est un problème si on veut verifier si un
> "float" peut être représenté comme "int"...

Pour une discussion plus complète du problème voir
<http://caml.inria.fr/FAQ/FAQ_EXPERT-fra.html#egalite>.

Le comportement que vous observez vient de ce que les flottants sont
des structures de données (généralement) allouées en mémoire. Or vous
utilisez le prédicat == qui teste l'identité physique, au lieu de =
qui teste l'égalité sémantique. Le test == donne alors des résultats
surprenants:

# 1.0 == 1.0;;
- : bool = false

Il suffit d'utiliser = pour que tout rentre dans l'ordre.

Pierre Weis

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







  reply	other threads:[~1998-09-14  7:55 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1998-09-12 13:22 Markus Mottl
1998-09-14  7:41 ` Pierre Weis [this message]
1998-09-14 10:13   ` Markus Mottl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=199809140741.JAA09810@pauillac.inria.fr \
    --to=pierre.weis@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=mottl@miss.wu-wien.ac.at \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox