Cette partie du forum n’est pas compatible avec les bloqueurs publicitaires
Félicitations à vous, de préférer les accès payants plutôt que la gratuité par la publicité, c’est honnorable et cohérent de votre part. Malheureusement, l’accès payant par micropaiement (qui serait d’environ 1 cent pour 20 pages consultées) n’est pour l’instant pas encore mis en place, et l’accès gratuit sans publicité, est réservé aux membres actif(ve)s du forum. En attendant, si vous souhaitez poursuivre votre visite chez nous, vous pouvez ajouter le site à votre liste blanche, ou encore mieux, désactiver le bloqueur partout. Pour ajouter le site à votre liste blanche, pour Firefox (similaire pour les autres navigateurs), rendez‑vous en bas à gauche de la fenêtre de votre navigateur, et cliquez sur le menu comme dans l’exemple de l’image ci‑dessous, puis rechargez la page, en appuyant sur F5.
|
|
Auteur | Message |
---|---|
Administrateur
|
D’un point de vue mathématique, l’ensemble ℕ des entiers naturels, est un sous‑ensemble de ℤ, l’ensemble des entiers relatifs, et on a ℕ ⊂ ℤ.
D’un point de vue informatique, les entiers peuvent être soit signés, non‑signés, en arithmétique modulo n, ou sans modulo (avec erreur de débordement, le cas échéant). D’un point de vue informatique toujours, un ensemble n’est jamais infini, et typiquement, il occupe un espace de n bits, dont le cardinal est au plus 2 ^ n. Soit on a alors un ensemble d’entiers naturels, inclus dans l’ensemble d’entiers relatifs et qui n’occupe alors pas tous les n bits qu’il pourrait occuper, soit on a un ensemble d’entiers naturels qui occupe tout l’espace de n bits qu’il peut occuper, mais qui ne respecte plus la relation ℕ ⊂ ℤ (ils sont cependant en intersection, et le cardinal de cette intersection, est 2 ^ n-1). C’est dit pompeusement (mais formellement), et voici une formulation plus courante que les gens concernés reconnaitront : sur une machine 32 bits, si les entiers relatifs occupent 32 bits, et si les entiers naturels sont inclus dans les entiers relatifs, alors les entiers naturels ne peuvent pas occuper 32 bits, et on perd des entiers naturels, car on borne leur intervalle pour pouvoir les inclure dans les entiers relatifs. Si on préfère ne pas perdre des entiers naturels, alors on peut leur allouer un espace de 32 bits, mais alors ils ne peuvent plus être tous inclus dans l’ensemble des entiers relatifs, car le plus grand entier naturel pouvant être représenté, sera plus grand que le plus grand entier relatif pouvant être représenté. Le langage Ada opte pour la première solution. C’est mathématiquement correcte, mais techniquement dommage, car quand on doit pouvoir travailler avec des entiers naturels sur 32 bits, on a pas d’autre choix que se rabattre sur les types modulo 2 ^ 32, qui ne correspondent plus mathématiquement aux entiers naturels, dont l’arithmétique n’est pas en modulo n. Avec SML, c’est encore plus décevant, car le standard du langage ne prévoit simplement pas de type pour les entiers naturels, et seulement un type pour les entiers relatifs, et c’est alors dans tous les cas que l’on doit se rabattre sur le type modulo, d’ailleurs unique (SML a un vocabulaire pauvre, comparé à Ada, pour la spécification des types numériques). Comme je supporte difficilement d’utiliser un type `int` quand il s’agit formellement d’un type `nat`, j’ai créé une signature et une structure naïve, mais fonctionnelle (sans jeux de mot, lol), offrant un type `nat`. Pour les raisons présentées plus haut, ce type `nat` n’est pas un sous‑ensemble du type `int`. L’inconvénient, ce sont les conversions nécessaires entre `int` et `nat` ; mais c’est à mon avis moins dommage que de perdre des entiers naturels ou que d’utiliser un type modulo. Dans le message suivant, est rapporté l’intégralité d’un source SML pas très long, pour une signature `NATURAL` et une structure `Nat` l’implémentant. Je ne répète pas les autres commentaires faits dans cette source SML. Remarque : il n’y a pas encore de colorisation pour SML, et je l’ajouterai un jour prochain. Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
|
|
Administrateur
|
Code :(* Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
Mauvaise surprise avec Poly/ML, interpréteur pour lequel sur une machine 32 bits, le type `word` est malheureusement sur 31 bits, ce qui lève une exception `Overflow` avec tous les calculs impliquant des entiers naturels nécessitant 32 bits.
Il est possible de le constater avec ce petit test : Code :val a = 0wxFF; Et effectivement : Code :print (Int.toString Word.wordSize ^ "\n"); Le compilateur MLton ne souffre pas de cette désastreuse limitation. Il est heureusement possible de rendre la structure `Nat` concrètement utilisable, en implémentant `nat` avec `SysWord.word` au lieu de `word`. Le second message a été mis à jour en conséquence. Pour Poly/ML, sur une machine 32 bits, `SysWord.wordSize` vaut bien 32. Un peu étonnement car il n’a pas la nécessité d’en faire autant, pour MLton sur la même machine 32 bits, `SysWord.wordSize` vaut 64 alors que `Word.wordSize`, y vaut 32 et aurait été suffisant, comme l’indique une référence de la librairie standard de base de SML : The WORD signature (standardml.org) standardml.org a écrit : The type SysWord.word is guaranteed to be large enough to hold any unsigned integral value used by the underlying system. MLton fait plus que le nécessaire sur ce point. Ça peut tout‑de‑même ne pas être une bonne chose en tous‑points, car des mots non‑natifs, de 64 bits, sur une machine 32 bits, nécessitent plus de traitement. Ce n’est pas très grave pour les additions et soustractions, mais il y a sûrement une pénalité non‑négligeable pour les multiplications, et encore plus pour les divisions et modulos. Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
|