Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Division et arrondi

54 réponses
Avatar
lhommedumatch
J'ai ce programme:
#include <iostream>
#include <math.h>

int main()
{
float x=3D10.0;
float y=3D1.0;
float scale=3D0.1;
int res;

res =3D 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'=E9clairer.
Merci

10 réponses

1 2 3 4 5
Avatar
JKB
Le 25-03-2009, ? propos de
Division et arrondi,
lhommedumatch ?crivait dans fr.comp.lang.c :
J'ai ce programme:
#include <iostream>
#include <math.h>

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.
Avatar
lhommedumatch
On 25 mar, 12:43, JKB wrote:
Le 25-03-2009, ? propos de
Division et arrondi,
 lhommedumatch ?crivait dans fr.comp.lang.c :



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

> 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)
Avatar
Marc Boyer
On 2009-03-25, lhommedumatch wrote:
J'ai ce programme:
#include <iostream>
#include <math.h>

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...
Avatar
-ed-
On 25 mar, 12:14, lhommedumatch wrote:
J'ai ce programme:
#include <iostream>



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



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

> 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?
Avatar
Eric Levenez
Le 25/03/09 18:50, dans
,
« lhommedumatch » a écrit :

La réponse ne tiendra pas en quelques lignes?



(int)0.99 égal 0 et pas 1.

--
Éric Lévénez -- <http://www.levenez.com/&gt;
Unix is not only an OS, it's a way of life.
Avatar
Kojak
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.
Avatar
Jean-Marc Bourguet
lhommedumatch writes:

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
Avatar
Marc Boyer
On 2009-03-25, lhommedumatch wrote:
On 25 mar, 16:11, Marc Boyer wrote:
On 2009-03-25, lhommedumatch wrote:

   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...
Avatar
Vincent Lefevre
Dans l'article ,
lhommedumatch écrit:

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 - Web: <http://www.vinc17.org/&gt;
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/&gt;
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
1 2 3 4 5