Почему "Divide by Zero" или любое другое исключение не было поднято?
У меня есть double[]
, на котором выполняется операция LINQ:
MD = MD.Select(n => n * 100 / MD.Sum()).ToArray();
В некоторых случаях все элементы из MD
равны 0, а затем Sum
также равно нулю. Затем 0 * 100 = 0 / 0
, но это не дает исключение по отдельности или исключение. Почему это так?
Ответы
Ответ 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 не выполняется.