Подтвердить что ты не робот

Почему "Divide by Zero" или любое другое исключение не было поднято?

У меня есть double[], на котором выполняется операция LINQ:

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

В некоторых случаях все элементы из MD равны 0, а затем Sum также равно нулю. Затем 0 * 100 = 0 / 0, но это не дает исключение по отдельности или исключение. Почему это так?

4b9b3361

Ответ 1

Попробуйте следующее:

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

Это тоже не вызовет исключения: он оставит z как положительную бесконечность. Здесь нет LINQ-специфичности - это просто арифметическое поведение с плавающей запятой IEEE-754.

В вашем случае вы делите нуль на ноль, так что вы получите не-число.

Ответ 2

Арифметика с плавающей запятой 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();
        }
    }
}

Вывод:

NaN
NaN
NaN
NaN
NaN

Ответ 3

Является ли Sum нулевым, потому что MD не содержит элементов? В этом случае выражение lambda не выполняется.