2017-01-09 8 views
3

Мне нужно получить -nan только double Тип и арифметика.Как получить -nan на C++ 14?

Таким образом, код должен быть таким:

double a = ... 

cout << a << endl; 

-nan 

где ... некоторое выражение.

+1

«Нужна». Это домашнее задание? –

ответ

5

Вы можете использовать только std::nan, например.

#include <iostream> 
#include <cmath> 

int main() 
{ 
    double a = -std::nan("1"); 

    std::cout << a << std::endl; 
} 

LIVE DEMO

+0

Я буду отмечать этот вопрос как ответ, но я сказал, что вам нужно использовать только арифметику, поэтому ответ (INFINITY_NUMBER/INFINITY_NUMBER) = -NaN, но я думаю, что вы сделали этот ответ только причиной моего плохого английского –

+0

Прости, да, я вероятно, не интерпретировал ваш вопрос так, как вы предполагали. В чем причина этого ограничения? Представление ? Можете ли вы не просто инициализировать значение как константу? –

2

Если ваша платформа использует плавающие точки IEEE754, то 0.0/0.0 будет оценивать NaN.

В качестве альтернативы вы можете использовать std::numeric_limits<double>::quiet_NaN(), проверив, что std::numeric_limits<double>::has_quiet_NaN является true на вашей платформе.

Действительно нет такой вещи, как подписанный NaN, хотя представление NaN может содержать бит знака, который может быть найден с помощью std::cout. Возможно, на вашей платформе -0.0/0.0 генерирует «отрицательный» NaN. Результат cout << a для случая, когда a равен NaN, полностью зависит от компилятора.

+0

Это единственный способ 'constexpr'. – Orient

+0

Действительно. По этой причине мне не нравится «std :: nan (« 1 »);« маршрут ». – Bathsheba

0

Чтобы получить отрицательный нан, просто ИЛИ представление NaN с 0x80000000. Вам придется играть с литьем адреса в unsigned char * или long long *, или в курс.