28 votes

Pourquoi "Divide by Zero" ou toute autre exception n'est-elle pas levée?

J'ai un double[] sur lequel une opération LINQ est effectuée:

 MD = MD.Select(n => n * 100 / MD.Sum()).ToArray();
 

Dans certains cas, tous les éléments de MD sont 0, puis Sum est également nul. Alors 0 * 100 = 0 / 0 , mais il ne donne pas d'exception de division par zéro ni aucune exception. Pourquoi cela est-il ainsi?

43voto

Jon Skeet Points 692016

Essaye ça:

 double x = 0.0;
double y = 1.0;
double z = y / x;
 

Cela ne lèvera pas d'exception non plus: cela laissera z comme infini positif. Il n'y a rien de spécifique à LINQ ici - c'est juste un comportement arithmétique à virgule flottante IEEE-754.

Dans votre cas, vous divisez zéro par zéro, vous vous retrouvez donc avec pas un nombre.

5voto

Alex Veremeenko Points 188

Arithmétique à virgule flottante IEEE-754:

 using System;
using System.Linq;

namespace ConsoleApplication1 {
    internal class Program {
        private static void Main() {
            var MD = new double [] {0, 0, 0, 0, 0};
            var result = MD.Select(n => n*100/MD.Sum()).ToArray();
            foreach (var item in result) {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }
    }
}
 

Production:

 NaN
NaN
NaN
NaN
NaN
 

0voto

Stefan Steinegger Points 37073

Sum nul parce que MD ne contient aucun élément? Dans ce cas, l'expression lambda n'est pas exécutée.

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