Adloun

Quatre divisions, et ce qu'OCaml refuse

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 2 — Le langage OCaml

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

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.