Дисклеймер: Нет, я не'т найти любой очевидный ответ, вопреки тому, что я ожидал!
Когда ищу примеры кода, в зависимости. среднее арифметическое, первые несколько примеров можно сунутся через Google, кажется, чтобы быть определенными, такими, что пустая последовательность формирует среднее значение 0.0
. (например. здесь и здесь ...)
Однако, глядя на Википедии, среднее арифметическое определяется, что пустая последовательность даст 0.0 / 0
--
A = 1/n ∑[i=1 -> n](a[i])
Так что если я пишу служебную функцию, которая вычисляет среднее арифметическое набора значений с плавающей точкой, я должен, в общем случае:
0.
для пустой последовательности?Нет'т ответ очевиден потому, что обращение зависит от того, как вы хотите сообщить вызывающему коду ошибки. (Или даже если вы хотите интерпретировать это как "по ошибке".)
Некоторые библиотеки/программы действительно Дон'т, как поднятие исключений, так что все значения сигнала. В этом случае, возвращаясь Нана (потому что значение выражения является технически определен) - это разумный выбор.
Вы также можете вернуться NaN, если вы хотите, чтобы "молча" и привести стоимость вперед через несколько другие расчеты. (Опираясь на поведение, что Нан в сочетании с чем-нибудь еще является "молча" И Нэн.)
Но учтите, что если вы вернетесь Нана для пустой последовательности, наложить бремя на вызывающий код, который они должны проверить возвращаемое значение функции, чтобы убедиться, что это'т НАН - либо сразу же после возвращения или позже. Это требование, которое легко пропустить, в зависимости от того, как привередливый вы находитесь в проверке возвращаемых значений.
Из-за этого, другие библиотеки/программы Точка зрения, что ошибки должны быть "шумно" и - если вы прошли пустой последовательности функции, что's для нахождения среднего значения последовательности, тогда вы'вэ явно что-то сделал очень неправильно, и это должно быть предельно ясно, что вы'вэ перепутались.
Конечно, если исключения могут возникать, они должны обрабатываться, но вы можете сделать это на более высоком уровне, потенциально централизации в точке, где это имеет смысл. В зависимости от вашей программы, это может быть легче или более вдоль линий стандартной обработки ошибок схема не двойной проверки возвращаемых значений.
Другие люди утверждают, что ваши функции должны быть устойчивыми к ошибке. Для максимальной надежности, то вам, наверное,'т использовать либо NaN или исключение - вам нужно выбрать фактическое число, которое на "смысл" в качестве значения для обычного пустого списка.
Какое значение будет сильно в каждом конкретном случае использовать. Например, если последовательность представляет собой список различий/ошибки, вы можете вернуть 0. Если вы'вновь результаты тестов в среднем (набрали 0-100), вы, возможно, захотите, чтобы вернуть 100 по пустой список ... или 0, в зависимости от того, что вашей философии от "запуск" и результат будет. Все зависит от того, что возвращаемое значение будет использоваться для.
Учитывая, что стоимость этого на "нейтраль" и стоимость будет сильно изменяться в зависимости от точного варианта использования, вы, возможно, захотите, чтобы на самом деле реализовать это в две функции - одна общая функция, которая возвращает значение NaN или вызывает исключение, и другой, который описывает общие функции и признает 'ошибка' футляр. Таким образом, вы можете иметь несколько версий, каждая с другой "по умолчанию" в случае. -- или если это то, что вы're делая это много, вы, возможно, даже в "по умолчанию" и значение параметра можно передать.
Опять же, нет'т однозначного ответа на этот вопрос: средний пустой последовательности неопределено. Как вы хотите справиться с этим тесно зависит от того, что результат вычислений используется для: просто дисплей, или дальнейший расчет? Стоит пустой список, быть исключительным, или он должен тихо работать? Вы действительно хотите обрабатывать особый случай в тот момент, это происходит, или ты хочешь пропустить/отложить обработку ошибок?
Математически, это'ов определен как знаменатель равен нулю.
Потому что поведение целочисленное деление на ноль не определено на C++, исключение, если вы're работая в целочисленных типов.
Если вы're работая в IEEE754 с плавающей точкой, а затем вернуться Нана с числитель также будет ноль. (+INF будет возвращен, если числитель положительный, и -INF, если числитель отрицательный).
Я предлагаю сохранить такое же поведение, как на 0.0 с 0 отдела, что это. Действительно, можно принять как-если правило. Таким образом, Вы оставаться согласованной с другими операциями, и вы Don'т придется принимать решение самостоятельно.
(Можно даже реализовать ее как таковой, возвращаясь 0.0/0, но компилятор может оптимизировать это самым неожиданным образом.)
Мне нравится защитного кодирования, так что я бы бросить исключение. Вы можете сделать это либо конкретные исключения (например, empty_sequence_exception) или деление на 0, так как делитель является длина последовательности составляет 0.
0.0 спорно, поскольку нет данных (последовательности).
Правильный ответ заключается в том, что среднее арифметическое пустая последовательность не имеет смысла, так как пустая последовательность является, по сути, пустое множество. Разделение не имеет смысла. Ноль-это конечно не правильный ответ. Сказать последовательность имеет 3 участника, 1, 0 и -1, или представляет собой последовательность из всех нулей. Среднее значение этих двух будет равна нулю, и не следует путать с пустой последовательностью.