Умышленно генерировать NaN и IND в C ++ - PullRequest
1 голос
/ 11 марта 2020

Я ценю, что это похоже на этот вопрос В чем разница между номерами 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 напрямую, без генерации ошибок или предупреждений компилятора?

...