Division et arrondi

Le
lhommedumatch
J'ai ce programme:
#include <iostream>
#include <math.h>

int main()
{
float x=10.0;
float y=1.0;
float scale=0.1;
int res;

res = int (x/scale);
std::cout << res << std::endl;
return 0;
}

Si je le compile avec:
version gcc 4.1.2 20071124 (Red Hat 4.1.2-42)
sur une machine 32bits j'obtiens 99
sur une machine 64bits j'obtiens 100

Quelqu'un pourrait m'éclairer.
Merci
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 6
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JKB
Le #18976421
Le 25-03-2009, ? propos de
Division et arrondi,
lhommedumatch ?crivait dans fr.comp.lang.c :
J'ai ce programme:
#include <iostream>
#include
int main()
{
float x.0;
float y=1.0;
float scale=0.1;
int res;

res = int (x/scale);
std::cout << res << std::endl;
return 0;
}

Si je le compile avec:
version gcc 4.1.2 20071124 (Red Hat 4.1.2-42)
sur une machine 32bits j'obtiens 99
sur une machine 64bits j'obtiens 100



Je vais peut-être dire une bêtise. Peut-on avoir la taille du float
sur les deux architectures ? 0.1 ne peut être représenté par une suite
finie de bit (donc sa représentation n'est pas exacte). x/scale peut
donc donner 99.9999999 en représentation décimale. Si la taille du float
n'est pas la même des deux côté, cela pourrait expliquer la différence
de comportement.

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
lhommedumatch
Le #18977811
On 25 mar, 12:43, JKB
Le 25-03-2009, ? propos de
Division et arrondi,
 lhommedumatch ?crivait dans fr.comp.lang.c :



> J'ai ce programme:
> #include <iostream>
> #include
> int main()
> {
>     float x.0;
>     float y=1.0;
>     float scale=0.1;
>     int res;

>     res = int (x/scale);
>     std::cout << res << std::endl;
>     return 0;
> }

> Si je le compile avec:
> version gcc 4.1.2 20071124 (Red Hat 4.1.2-42)
> sur une machine 32bits j'obtiens 99
> sur une machine 64bits j'obtiens 100

        Je vais peut-être dire une bêtise. Peut-on avoir la t aille du float
sur les deux architectures ? 0.1 ne peut être représenté par une su ite
finie de bit (donc sa représentation n'est pas exacte). x/scale peut
donc donner 99.9999999 en représentation décimale. Si la taille du fl oat
n'est pas la même des deux côté, cela pourrait expliquer la diffé rence
de comportement.

        Cordialement,

        JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2 % de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.



sizeof float =4 sur les 2 plateformes.

(Si je change le scale par 0.01 j'obtiens 1000 sur les 2 plateformes)
Marc Boyer
Le #18978171
On 2009-03-25, lhommedumatch
J'ai ce programme:
#include <iostream>
#include
int main()
{
float x.0;
float y=1.0;
float scale=0.1;
int res;

res = int (x/scale);
std::cout << res << std::endl;
return 0;
}

Si je le compile avec:
version gcc 4.1.2 20071124 (Red Hat 4.1.2-42)
sur une machine 32bits j'obtiens 99
sur une machine 64bits j'obtiens 100

Quelqu'un pourrait m'éclairer.



Bienvenu dans le monde des nombres flottants...
En fait, il faudrait savoir quel niveau de réponse tu désires.
Soit tu es novice en calcul numérique, et le mieux qu'on puisse
te conseiller, c'est soit de renoncer à comprendre et d'accepter
que les flottants font des arrondis dépendant de pleins de
choses, soit de commencer à te documenter
http://www.validlab.com/goldberg/

Soit tu sais déjà tout ça, et essaye d'appater quelques spécialistes
du sujet avec un titre plus accrocheur.

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...
-ed-
Le #18979661
On 25 mar, 12:14, lhommedumatch
J'ai ce programme:
#include <iostream>



C'est pas du C. Le C++, c'est à coté.
lhommedumatch
Le #18979931
On 25 mar, 16:11, Marc Boyer
On 2009-03-25, lhommedumatch


> J'ai ce programme:
> #include <iostream>
> #include
> int main()
> {
>     float x.0;
>     float y=1.0;
>     float scale=0.1;
>     int res;

>     res = int (x/scale);
>     std::cout << res << std::endl;
>     return 0;
> }

> Si je le compile avec:
> version gcc 4.1.2 20071124 (Red Hat 4.1.2-42)
> sur une machine 32bits j'obtiens 99
> sur une machine 64bits j'obtiens 100

> Quelqu'un pourrait m'éclairer.

   Bienvenu dans le monde des nombres flottants...
En fait, il faudrait savoir quel niveau de réponse tu désires.
Soit tu es novice en calcul numérique, et le mieux qu'on puisse
te conseiller, c'est soit de renoncer à comprendre et d'accepter
que les flottants font des arrondis dépendant de pleins de
choses, soit de commencer à te documenter
   http://www.validlab.com/goldberg/

Soit tu sais déjà tout ça, et essaye d'appater quelques spécialis tes
du sujet avec un titre plus accrocheur.

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...



Ok merci pour cette réponse.
La réponse ne tiendra pas en quelques lignes?
Eric Levenez
Le #18980551
Le 25/03/09 18:50, dans
« lhommedumatch »
La réponse ne tiendra pas en quelques lignes?



(int)0.99 égal 0 et pas 1.

--
Éric Lévénez -- Unix is not only an OS, it's a way of life.
Kojak
Le #18981471
Le Wed, 25 Mar 2009 04:14:47 -0700 (PDT),
lhommedumatch a écrit :

J'ai ce programme:
[...]
float x.0;
float scale=0.1;
int res;

res = int (x/scale);
[...]
version gcc 4.1.2 20071124 (Red Hat 4.1.2-42)
sur une machine 32bits j'obtiens 99
sur une machine 64bits j'obtiens 100



Essaye avec l'option "-ffloat-store", ça peut aider...

--
Jacques.
Jean-Marc Bourguet
Le #18983481
lhommedumatch
La réponse ne tiendra pas en quelques lignes?



En deux lignes: n'utilise pas les formats flottants si tu n'es pas pret a
investir le temps necessaire pour les comprendre.

Et globalement, ce conseil est valable pour tout; mais les flottants sont
particulierement piegeux parce qu'on est famillier avec les reels, et qu'on
a tendance a extrapoler aux flottants des proprietes qu'ils n'ont pas parce
que les reels les ont.

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer
Le #18983751
On 2009-03-25, lhommedumatch
On 25 mar, 16:11, Marc Boyer
On 2009-03-25, lhommedumatch
   Bienvenu dans le monde des nombres flottants...
En fait, il faudrait savoir quel niveau de réponse tu désires.
Soit tu es novice en calcul numérique, et le mieux qu'on puisse
te conseiller, c'est soit de renoncer à comprendre et d'accepter
que les flottants font des arrondis dépendant de pleins de
choses, soit de commencer à te documenter
   http://www.validlab.com/goldberg/

Soit tu sais déjà tout ça, et essaye d'appater quelques spécialistes
du sujet avec un titre plus accrocheur.

Marc Boyer



Ok merci pour cette réponse.
La réponse ne tiendra pas en quelques lignes?



En quelques lignes, on peut dire que les nombre flottant représentent
mal les puissances de 10 (puisqu'ils représentent les nombres en puissance
de deux), et que pleins de gens surement très intelligents travaillent pour
que les arrondis se fassent "au mieux" tout en restant efficace.

Quand on est pas un spécialiste, on s'en tient à quelques règles
comme "toujours comparer les flottants avec une marge d'erreur"
(en ne confondant pas erreur relative et absolule), "ne pas
convertir les flottant en entier", et "si c'est important, appeller
un spécialiste".
Le grand classique, c'est la facture ou la somme du montant HT
et de la TVA ne donne pas le montant TTC...

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...
Vincent Lefevre
Le #18988221
Dans l'article lhommedumatch
sizeof float =4 sur les 2 plateformes.



Même si la taille est la même, il est possible que les calculs se
fassent dans une plus grande précision. En particulier,

x86, 32 bits, FPU traditionnel -> précision étendue
x86, 64 bits (ou SSE2) -> simple précision via SSE

D'où des comportements qui peuvent différer.

Cf http://www.vinc17.org/research/extended.fr.html par exemple.

Je recommande la lecture du papier de Goldberg, et en particulier
de l'addendum (cités sur ma page).

(Si je change le scale par 0.01 j'obtiens 1000 sur les 2 plateformes)



Parfois tu vas obtenir le même résultat, parfois pas: tout dépend
de comment les arrondis vont se faire.

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Publicité
Poster une réponse
Anonyme