Adloun

informatique (MP2I/MPI) · Chapitre 2 · Application directe du cours

Quatre divisions, et ce qu'OCaml refuse

Le langage OCaml · niveau 2

Énoncé

Que valent les quatre premières expressions ? Que fait le compilateur des deux dernières ?


7 / 2
(-7) / 2
(-7) mod 2
7.0 /. 2.0
1 + 2.5
let x : float = 7 / 2

Corrigé

Les quatre premières valent respectivement , , et . La division entière tronque vers zéro, comme en C ; le reste porte donc le signe du dividende.

iRemarqueL'annexe est prudente sur mod

Elle n'exige mod sans rappel que « quand toutes les grandeurs sont positives » ; le cas des opérandes de signes quelconques figure en B.2, c'est-à-dire après rappel. La mesure ci-dessus n'est donc pas une connaissance exigible, c'est une vérification.

Les deux dernières ne compilent pas, et c'est le cœur de l'exercice :


1 | let x = 1 + 2.5
                ^^^
Error: The constant 2.5 has type float but an expression was expected of type
         int

1 | let x : float = 7 / 2
                    ^^^^^
Error: This expression has type int but an expression was expected of type
         float

Comparez à l'exercice 1.1. En C, double b = 7 / 2; était accepté et valait : la division entière s'était déguisée en division réelle, sans un mot. Ici, la même intention produit une erreur de compilation, à la ligne exacte, avant la moindre exécution. Le typage fort n'empêche pas d'écrire une division entière — il empêche de croire qu'on en écrivait une autre. La correction s'écrit float_of_int 7 /. 2.0, et l'on voit alors ce qu'on fait.

Ce que le typage fort ne protège pas. L'arithmétique elle-même. max_int vaut — un int OCaml occupe bits utiles —, et max_int + 1 vaut , en silence. « Entiers et flottants sont sujets aux dépassements de capacité » : le débordement du chapitre chap:langage-c traverse la frontière des langages.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre