OVH Cloud OVH Cloud

1.0/0.0

17 réponses
Avatar
Laurent Deniau
Existe-t-il un truc (un cast ou je ne sais quoi) permettant d'eviter les
warnings du compilateur (independament du compilateur) tout en ayant la valeur
1.0/0.0 calculee a la compilation? J'ai essaye de decomposer le calcul via une
variable locale, mais il reconnait la division par 0.0 tot ou tard... Mon but
est biensur d'obtenir inf (en C89).

a+, ld.

--
[ Laurent Deniau -- Scientific Computing & Data Analysis ]
[ CERN -- European Center for Nuclear Research ]
[ Laurent.Deniau@cern.ch - http://cern.ch/Laurent.Deniau ]
[ -- One becomes old when dreams become regrets -- ]

10 réponses

1 2
Avatar
Éric Lévénez
Le 25/08/03 17:26, dans , « Laurent Deniau »
a écrit :

Existe-t-il un truc (un cast ou je ne sais quoi) permettant d'eviter les
warnings du compilateur (independament du compilateur) tout en ayant la valeur
1.0/0.0 calculee a la compilation? J'ai essaye de decomposer le calcul via une
variable locale, mais il reconnait la division par 0.0 tot ou tard... Mon but
est biensur d'obtenir inf (en C89).


#include <stdio.h>

int main(void)
{
double d = 1.0 / 0.0;
(void)printf("%gn", d);
return 0;
}

Affiche "Inf" avec GCC et pas de warning.

--
Éric Lévénez -- <http://www.levenez.com>
Unix is not only an OS, it's a way of life.

Avatar
Gabriel Dos Reis
Laurent Deniau writes:

| Existe-t-il un truc (un cast ou je ne sais quoi) permettant d'eviter
| les warnings du compilateur (independament du compilateur) tout en
| ayant la valeur 1.0/0.0 calculee a la compilation? J'ai essaye de
| decomposer le calcul via une variable locale, mais il reconnait la
| division par 0.0 tot ou tard... Mon but est biensur d'obtenir inf (en
| C89).

Il y a un peu longtemps, dans ma première implémentation de <limits>
dans GCC où l'en-tête était généré à la compilation, j'ai eu le même
problème. J'ai fini par sortir le grand marteau :


volatile double one = 1.0;
volatile double zero = 0.0;
double infinity = one / zero;

à l'époque, cela a suffit à faire taire le compilateur -- mais ce
n'est pas quelque chose dont je suis particulièrement fier.

-- Gaby
Avatar
Gabriel Dos Reis
Éric Lévénez writes:

| Affiche "Inf" avec GCC et pas de warning.

Cela dépend du niveau de warning et d'optimisation que tu spécifies.

-- Gaby
Avatar
Laurent Deniau
Gabriel Dos Reis wrote:
Laurent Deniau writes:

| Existe-t-il un truc (un cast ou je ne sais quoi) permettant d'eviter
| les warnings du compilateur (independament du compilateur) tout en
| ayant la valeur 1.0/0.0 calculee a la compilation? J'ai essaye de
| decomposer le calcul via une variable locale, mais il reconnait la
| division par 0.0 tot ou tard... Mon but est biensur d'obtenir inf (en
| C89).

Il y a un peu longtemps, dans ma première implémentation de <limits>
dans GCC où l'en-tête était généré à la compilation, j'ai eu le même
problème. J'ai fini par sortir le grand marteau :


volatile double one = 1.0;
volatile double zero = 0.0;
double infinity = one / zero;

à l'époque, cela a suffit à faire taire le compilateur -- mais ce
n'est pas quelque chose dont je suis particulièrement fier.


Mais a priori, le volatile force le compilateur a calculer infinity au runtime...

a+, ld.

--
[ Laurent Deniau -- Scientific Computing & Data Analysis ]
[ CERN -- European Center for Nuclear Research ]
[ - http://cern.ch/Laurent.Deniau ]
[ -- One becomes old when dreams become regrets -- ]

Avatar
Éric Lévénez
Le 25/08/03 19:11, dans ,
« Gabriel Dos Reis » a écrit :

Éric Lévénez writes:

| Affiche "Inf" avec GCC et pas de warning.

Cela dépend du niveau de warning et d'optimisation que tu spécifies.


J'ai beau cherché, je ne vois pas comment afficher un warning avec ma ligne
de code. Cela dépend peut-être du CPU cible.

% cc -v
Reading specs from /usr/libexec/gcc/darwin/ppc/3.3/specs
Thread model: posix
gcc version 3.3 20030304 (Apple Computer, Inc. build 1435)

--
Éric Lévénez -- <http://www.levenez.com>
Unix is not only an OS, it's a way of life.

Avatar
Laurent Deniau
Éric Lévénez wrote:
Le 25/08/03 19:11, dans ,


Éric Lévénez writes:

| Affiche "Inf" avec GCC et pas de warning.

Cela dépend du niveau de warning et d'optimisation que tu spécifies.



J'ai beau cherché, je ne vois pas comment afficher un warning avec ma ligne
de code. Cela dépend peut-être du CPU cible.

% cc -v
Reading specs from /usr/libexec/gcc/darwin/ppc/3.3/specs
Thread model: posix
gcc version 3.3 20030304 (Apple Computer, Inc. build 1435)


cc -Wall -W -ansi -pedantic -O3

C'est le -W qui doit activer le warning.

a+, ld.

--
[ Laurent Deniau -- Scientific Computing & Data Analysis ]
[ CERN -- European Center for Nuclear Research ]
[ - http://cern.ch/Laurent.Deniau ]
[ -- One becomes old when dreams become regrets -- ]


Avatar
Jean-Marc
"Gabriel Dos Reis" a écrit:
Éric Lévénez writes:

| Affiche "Inf" avec GCC et pas de warning.

Cela dépend du niveau de warning et d'optimisation que tu spécifies.


Avec les options "-z -c -ansi -Wall" , aucun warning sur Gcc 68k.

Par contre, la valeur 0.0 a t-elle un signe ? Gcc me dit oui:

double d = 1.0 / 0.0; => "+inf"
double d = -1.0 / 0.0; => "-inf"
double d = 1.0 / -0.0; => "-inf"
double d = -1.0 / -0.0; => "+inf"


A
+
Jean-Marc

Avatar
Gabriel Dos Reis
Éric Lévénez writes:

| Le 25/08/03 19:11, dans ,
| « Gabriel Dos Reis » a écrit :
|
| > Éric Lévénez writes:
| >
| > | Affiche "Inf" avec GCC et pas de warning.
| >
| > Cela dépend du niveau de warning et d'optimisation que tu spécifies.
|
| J'ai beau cherché, je ne vois pas comment afficher un warning avec ma ligne
| de code. Cela dépend peut-être du CPU cible.

OK, je vois ce qui a changé dans GCC-3.3. Si tu écris

1.0 / 0

au lieu de

1.0 / 0.0

tu obtiens le warning -- ce qui est stupide.

-- Gaby
Avatar
Éric Lévénez
Le 25/08/03 19:24, dans , « Laurent Deniau »
a écrit :

Éric Lévénez wrote:
Le 25/08/03 19:11, dans ,


Éric Lévénez writes:

| Affiche "Inf" avec GCC et pas de warning.

Cela dépend du niveau de warning et d'optimisation que tu spécifies.



J'ai beau cherché, je ne vois pas comment afficher un warning avec ma ligne
de code. Cela dépend peut-être du CPU cible.

% cc -v
Reading specs from /usr/libexec/gcc/darwin/ppc/3.3/specs
Thread model: posix
gcc version 3.3 20030304 (Apple Computer, Inc. build 1435)


cc -Wall -W -ansi -pedantic -O3

C'est le -W qui doit activer le warning.


Non, toujours pas de warning.

--
Éric Lévénez -- <http://www.levenez.com>
Unix is not only an OS, it's a way of life.



Avatar
Gabriel Dos Reis
"Jean-Marc" writes:

| Par contre, la valeur 0.0 a t-elle un signe ? Gcc me dit oui:

Oui. Grace à IEEE-754, qui a inventé +0.0 et -0.0.

-- Gaby
1 2