2 votes

C++ ; exception à la virgule flottante ; sans opérateur ./.

L'exemple ci-dessous, est tiré de la documentation d'OpenCv [1].

Mat H(100, 100, CV_64F);
for(int i = 0; i < H.rows; i++)
    for(int j = 0; j < H.cols; j++)
        H.at<double>(i,j)=1./(i+j);

Cela fonctionne parfaitement bien. Mais dans la dernière ligne, qu'est-ce que l'opérateur ./ ? Et si je le remplace par /, cela me donne une exception de virgule flottante.

Donc, dans les deux cas, nous avons l'infini quand i et j sont 0 ; alors pourquoi avons-nous une exception de virgule flottante pour le deuxième cas ?

[1] http://docs.opencv.org/trunk/d3/d63/classcv_1_1Mat.html

4voto

StoryTeller Points 6139

./ n'est pas un opérateur. Le point se lie avec le 1 ce qui en fait une double constante. C'est équivalent à ceci :

1.0 / (i+j+1)

Seulement un peu plus court.

Lorsque vous omettez le point, l'expression est évaluée en utilisant l'arithmétique des nombres entiers, ce qui donne zéro pour toutes les entrées, à l'exception de 0, 0 .

2voto

Ron Points 10773

El . fait partie de la 1. double littéral. / est un opérateur arithmétique, donc l'expression de droite devient :

1. / (i+j+1);

et le résultat est une valeur de type double. En omettant le . fait de lui un littéral entier de 1 et l'expression devient :

1 / (i+j+1);

où les deux opérandes sont des valeurs entières et le résultat est une valeur entière. Les espaces dans le code C++ ne font aucune différence pour le compilateur. Pour des raisons de lisibilité, la déclaration doit inclure des espaces lorsque cela est approprié :

H.at<double>(i,j) = 1. / (i+j+1);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X