Représentation des nombres et conséquences

publicité
I2
Représentation des nombres et conséquences
Code I2.1: De l’intérêt de toujours définir sa base de comptage...
If you get an 11/100 on a CS test,
but you claim it should be counted as a "C",
they'll probably decide you deserve the upgrade.
.com
Code I2.2: 0,1 + 0,2 ne donne pas 0,3 !!
>>> 0.1 + 0.1 == 0.2
True
>>> 0.2 + 0.2 == 0.4
True
>>> 0.1 + 0.2 == 0.3
False
>>> 3*0.1
== 0.3
False
## Normal
## Normal
## Bizarre !
## Aussi bizarre ! (mais cohérent avec le précédent)
E Bougnol, JJ Fleck,
M Heckmann & M Kostyra,
Kléber, PCSI& -
I2
Représentation des nombres et conséquences
Code I2.3: Pour quelques CS de plus...
>>> t = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2]
>>> for i in range(1,13):
...
print(’%02d*0.1 == %25.25f ?: %s’ % (i,t[i-1],i*0.1 == t[i-1]))
...
01*0.1 == 0.1000000000000000055511151 ?: True
02*0.1 == 0.2000000000000000111022302 ?: True
03*0.1 == 0.2999999999999999888977698 ?: False
04*0.1 == 0.4000000000000000222044605 ?: True
05*0.1 == 0.5000000000000000000000000 ?: True
06*0.1 == 0.5999999999999999777955395 ?: False
07*0.1 == 0.6999999999999999555910790 ?: False
08*0.1 == 0.8000000000000000444089210 ?: True
09*0.1 == 0.9000000000000000222044605 ?: True
10*0.1 == 1.0000000000000000000000000 ?: True
11*0.1 == 1.1000000000000000888178420 ?: True
12*0.1 == 1.1999999999999999555910790 ?: False
Code I2.4: Les calculs sont faux !
>>> a = 10**205+1
>>> a-10**205 == 1
True
>>> b = 10**205+1.0
>>> b-10**205 == 1
False
>>> b - 10**205-1
-1.0
## a est un entier
## le calcul en entier est correct
## b est un flottant
## Et là, la limite de précision intervient
Code I2.5: Toujours comparer à ε près
>>> epsilon = 0.1 + 0.2 - 0.3
>>> epsilon
5.551115123125783e-17
>>> def compare_a_epsilon_pres(x,y,epsilon=1e-9):
...
return abs(x-y)<epsilon
...
>>> compare_a_epsilon_pres(0.1+0.2,0.3)
True
2/4
E Bougnol, JJ Fleck,
M Heckmann & M Kostyra,
Kléber, PCSI& -
I2
Représentation des nombres et conséquences
3/4
Code I2.6: Même la solution d’une équation du second degré est fausse !
>>> from math import *
## Pour les fonctions mathématiques
>>> a,b,c = 1,-2,-5
## Une équation du type ax^2 + bx + c = 0
>>> delta = b**2 - 4*a*c ## Le discrimant correspondant
>>>
## Et les deux solutions
>>> x1,x2 = (-b+sqrt(delta))/(2.0*a),(-b-sqrt(delta))/(2.0*a)
>>>
## Ne reste qu’à vérifier si elles marchent
>>> a*x1**2 + b*x1 + c
## Caramba !
-1.7763568394002505e-15
>>> a*x2**2 + b*x2 + c
## Encore raté !
-8.881784197001252e-16
Code I2.7: Un problème de précision ?
Also, I hear the 4th root of (9^2 + 19^2/22) is pi.
Code I2.8: Format « simple precision » à 32 bits et « double precision » à 64 bits
.com
E Bougnol, JJ Fleck,
M Heckmann & M Kostyra,
Kléber, PCSI& -
I2
Représentation des nombres et conséquences
4/4
Code I2.9: Next stop: Python
I wrote 20 short programs in Python yesterday.
Perl, I'm leaving you.
It was wonderful.
.com
Téléchargement