/ / Étrange arrondi dans différentes langues [fermé] - c, ruby, perl, bash, haskell

Étrange «moitié à même» arrondi dans différentes langues [fermé] - c, ruby, perl, bash, haskell

GNU bash, version 4.2.24:

$> printf "%.0f, %.0fn" 48.5 49.5
48, 50

Ruby 1.8.7

> printf( "%.0f, %.0fn", 48.5, 49.5 )
48, 50

Perl 5.12.4

$> perl -e "printf( "%.0f, %.0fn", 48.5, 49.5 )"
48, 50

gcc 4.5.3:

> printf( "%.0f, %.0fn", 48.5, 49.5 );
48, 50

GHC, version 7.0.4:

> printf "%.0f, %.0fn" 48.5 49.5
49, 50

Wikipedia dit que ce genre d'arrondissement s'appelle arrondir la moitié à même:

C'est le mode d'arrondi par défaut utilisé dans les fonctions et les opérateurs informatiques IEEE 754.

Pourquoi cet arrondi est-il utilisé par défaut dans C, Perl, Ruby et bash, mais pas dans Haskell?

Est-ce une sorte de tradition ou de standard? Et si c’est un standard, pourquoi est-il utilisé par ces langues et non par Haskell? À quoi sert-il d’arrondir à moitié?

Réponses:

11 pour la réponse № 1
GHCi> round 48.5
48
GHCi> round 49.5
50

La seule différence est que printf n'utilise pas round - probablement parce qu’il doit pouvoir arrondir à plus que des entiers entiers. Je ne pense pas que IEEE 754 spécifie quoi que ce soit sur la mise en oeuvre printffonctions de formatage de style, juste arrondi, que Haskell fait correctement.

Ce serait probablement mieux si printf était compatible avec round et autres langages ", mais je ne pense pas que ce soit vraiment un gros problème.


6 pour la réponse № 2

"Round to even" est l'option par défaut à utiliser avec IEEE 754. Haskell devrait probablement passer à l'utiliser dans printf pour des raisons de cohérence. La ligne de code pertinente est en GHC.Float

f 0 (x:_)  = (if x >= b2 then 1 else 0, [])

Donc, si quelqu'un veut résoudre ce problème, il peut le faire. Comme le souligne ehird, cela ne ferait que rendre la roundTo fonction utilisée par printf cohérent avec round bien que je ne sois pas sûr de l’autre code dans lequel ce changement serait cassé.

EDIT: une version précédente de cette réponse avait mal indiqué l’emplacement du code d’arrondi. La seule différence significative entre les deux implémentations est si elles sont codées en dur pour utiliser la base 10.


2 pour la réponse № 3

Je ne peux pas dire avec certitude, mais cela doit probablement être faitavec le fait que ce type d’arrondi est couramment utilisé dans les fonctions de comptabilité, comme on l’appelle aussi "arrondi du banquier". Si vous regardez plus loin l’article de Wikipedia sur l’arrondi, vous remarquerez également que c’est le défaut dans IEEE 754, alors Haskell n'est probablement pas conforme à cette norme.