Я ценю, что это похоже на этот вопрос В чем разница между номерами IND и NAN , но на этот вопрос не был получен нужный мне ответ.
Насколько я понимаю, (( с VC ++) IND (неопределенное число) вызывается математической операцией, которая не может быть выполнена и не является бесконечностью. Например, INF*0.0
, INF/INF
или 0.0/0.0
. Это отличается от «обычного» NaN, который можно получить из std::numeric_limits<double>::quiet_nan()
.
У меня есть функция, которую я хотел бы вернуть IND в некоторых случаях. Например, в функции, которая получает среднее значение std::vector<double>
, я хотел бы вернуть IND
, если вектор имеет нулевые элементы.
Если я сделаю
return 0.0/0.0;
, я получу ошибка компилятора C2124 Я могу разделить на результат функции, которая, я знаю, вернет ноль, но даже тогда компилятор часто достаточно умен, чтобы понять это и выдать предупреждение C4723: потенциальное деление на 0.
способ получить эту спецификацию c NaN без генерации ошибок компилятора или предупреждений?
Редактировать после комментария @ adrian-mole
Следующий код
#include <iostream>
#include<limits>
int main()
{
std::cout << "numeric_limits nan = " << std::numeric_limits<double>::quiet_NaN() << "\n";
double zero = 0.0;
std::cout << "1.0/0.0 = " << 1.0 / zero << "\n";
std::cout << "0.0/0.0 = " << 0.0 / zero << "\n";
std::cout << "sqrt(-1.0) = " << std::sqrt(-1.0) << "\n";
}
при компиляции с выходами visual studio 2019
numeric_limits nan = nan
1.0/0.0 = inf
0.0/0.0 = -nan(ind)
sqrt(-1.0) = -nan(ind)
Это потенциально (но не обязательно) противоречит этому ответу { ссылка }
Согласно Википедии https://en.wikipedia.org/wiki/IEEE_754:
Из-за возможности множественного кодирования (по крайней мере, в форматах, называемых форматами обмена), NaN может нести другую информацию: бит знака (который не имеет значения, но может использоваться некоторые операции) и полезную нагрузку, которая предназначена для диагностики c информации, указывающей источник NaN
Что я предполагаю, что происходит здесь.
Возможно ли это для мне получить доступ к типу -nan (ind) типа nan напрямую, без генерации ошибок или предупреждений компилятора?