Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
* Bug converting numbers?
@ 1998-09-12 13:22 Markus Mottl
  1998-09-14  7:41 ` Pierre Weis
  0 siblings, 1 reply; 3+ messages in thread
From: Markus Mottl @ 1998-09-12 13:22 UTC (permalink / raw)
  To: OCAML

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

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

Regards,
Markus Mottl

-- 
*  Markus Mottl              |  University of Economics and       *
*  Department of Applied     |  Business Administration           *
*  Computer Science          |  Vienna, Austria                   *
*  mottl@miss.wu-wien.ac.at  |  http://miss.wu-wien.ac.at/~mottl  *





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

* Re: Bug converting numbers?
  1998-09-12 13:22 Bug converting numbers? Markus Mottl
@ 1998-09-14  7:41 ` Pierre Weis
  1998-09-14 10:13   ` Markus Mottl
  0 siblings, 1 reply; 3+ messages in thread
From: Pierre Weis @ 1998-09-14  7:41 UTC (permalink / raw)
  To: Markus Mottl; +Cc: caml-list

> 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/







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

* Re: Bug converting numbers?
  1998-09-14  7:41 ` Pierre Weis
@ 1998-09-14 10:13   ` Markus Mottl
  0 siblings, 0 replies; 3+ messages in thread
From: Markus Mottl @ 1998-09-14 10:13 UTC (permalink / raw)
  To: Pierre Weis

Hello - Bonjour!

> 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:

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

Ah, everything clear! Having programmed in other languages lately, where
'==' means semantical equality, I easily read over this bug, although
I knew that there exist two operators for testing semantic equality or
representational identity respectively in Ocaml.

Especially, because:

# 1 == 1;;
- : bool = true

but

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

This is certainly not, what the casual Ocaml-user expects...

Since there are probably many Ocaml-users who also use languages where
'==' expresses semantic equality (C/C++ is not the only one - e.g. Haskell
also uses this operator), wouldn't it be a good idea to take a different
operator than '==' for checking representational identity? As I had to
realize, such bugs can be really hard to track down. And since this
operator is probably not so often in use in "normal" Ocaml-programs,
it would not really effect too many developers.

Best regards,
Markus Mottl


français:

Beaucoup de programmeurs en Ocaml aussi écrivent aux langues ou '=='
exprime l'égalité sémantique.  Ne serait-il pas une bonne idée de
prendre un operateur différent en place de "==" pour exprimer l'identité
de représentation en Ocaml? Comme je ai du voir, il peut être très
difficile de trouver des erreurs de cette sorte.
Parce-que ce n'est pas un operateur souvant utilisé, je ne crois pas
que ce changement aie un effet fort aux developeurs.

Amicalement,
Markus Mottl

-- 
*  Markus Mottl              |  University of Economics and       *
*  Department of Applied     |  Business Administration           *
*  Computer Science          |  Vienna, Austria                   *
*  mottl@miss.wu-wien.ac.at  |  http://miss.wu-wien.ac.at/~mottl  *




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

end of thread, other threads:[~1998-09-14  9:35 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1998-09-12 13:22 Bug converting numbers? Markus Mottl
1998-09-14  7:41 ` Pierre Weis
1998-09-14 10:13   ` Markus Mottl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox