2014-09-01 2 views
4

Если вы хотите инициализировать поплавок с «неинициализированным» состоянием, какое значение вы бы выбрали? (значение легко проверяемое и наименее вероятное для путаницы с фактическим значением)Неинициализированный поплавок (C++)

float min = -999999;

может иметь проблемы потенциально либо быть перепутаны с фактическим значением или даже испытывается из-за нечетких флоат закруглений (и это выглядит наивным :-)

+0

'повышение :: опциональный '? – Jarod42

ответ

12

Если вы хотите, чтобы избежать использования действительных значений float, вам может использовать NAN:

#include <limits> 

.... 
float min = std::numeric_limits<float>::quiet_NaN(); 

Вы можете использовать std::isnan проверить:

#include <cmath> 

.... 
bool not_cool = std::isnan(min); 
+0

Хорошо, спасибо. Быть на C99 кажется, что isnan недоступен, но сравнение float с std :: numeric_limits :: quiet_NaN() похоже работает – Joan

+2

@Juan Будьте очень осторожны в сравнении значений, которые могут быть NaN. Так работает if (myVal == std :: numeric_limits :: quiet_NaN()) всегда будет ложным, даже если myVal установлен в std :: numeric_limits :: quiet_NaN(). Вам нужен эквивалент isnan. [EDIT: см. Http://ideone.com/hzFCyB] –

+0

Спасибо, Майк, кажется, что здесь мы находимся на неопределенных территориях :-) – Joan

3

Судя по имени переменной min, вы хотели бы, чтобы он был как можно большим. Таким образом, любое сравнение с этим значением будет меньшим значением и обновит ваш minValue.

float minValue = std::numeric_limits<float>::max(); 

P.S. не назовите свою переменную min или вы рискуете вызвать проблемы с тем, чтобы затенять имя.

+4

Проблемы с затенением имен на самом деле не проблема, когда вы фактически добавляете 'std ::' к вещам. – chris

+0

Я просто имею в виду потенциальное нежелательное поведение в целом. Тем более, что каждый всегда любит делать 'using namespace std', что так же плохо – CoryKramer

+1

@Cyber: Правильно, поэтому не делайте этого. –

5

Вы можете использовать NAN. Однако

Проблема заключалась в использовании неинициализированной переменной с плавающей запятой. В отличие от целых чисел, не все битовые шаблоны действительны для использования в качестве значений . Существует категория значений, известная как сигнализация NaNs, или SNaN для краткости, которые являются специальными значениями «не число». Если вы спросите процессора, он будет следить за этими сигнальными NaN и , если возникает столкновение с «недопустимым операндом». (Это, в конце концов, вся причина, почему это называется сигнализации NaN.)

Кроме того, я хотел бы предложить вам использовать Boost.Optional так:

boost::optional<float> minValue; // initially unset 
+2

Boost.Optional - мой выбор и для таких «проблем», особенно скоро будет «std :: optional ' –

+0

Откуда эта цитата? Приведите свои источники. –

+0

@LightnessRacesinOrbit: - Я цитирую сайт в [NAN] (http://blogs.msdn.com/b/oldnewthing/archive/2008/07/02/8679191.aspx) –

Смежные вопросы