Использование NaN в C++?

Вы можете легко сделать это из словаря списков:

public class MultiValueDictionary<Key, Value> : Dictionary<Key, List<Value>> {

  public void Add(Key key, Value value) {
    List<Value> values;
    if (!this.TryGetValue(key, out values)) {
      values = new List<Value>();
      this.Add(key, values);
    }
    values.Add(value);
  }

}
32
задан Josh Kelley 25 October 2008 в 21:43
поделиться

5 ответов

После изучения этого еще немного это похоже signaling_NaN, бесполезно как предусмотрено. Если исключения в операции с плавающей запятой включены, то вызов его рассчитывает как обработка сигнального NaN, таким образом, это сразу повышает исключение. Если исключения в операции с плавающей запятой отключены, то обработка сигнального NaN автоматически понижает его до тихого NaN, таким образом signaling_NaN не работает так или иначе.

код Menkboy работы, но пытающийся использовать сигнальный NaNs сталкивается с другими проблемами: нет никакого портативного способа включить или отключить исключения в операции с плавающей запятой (как сослался на здесь и здесь ), и если Вы полагаетесь на включаемые исключения, сторонний код может отключить их (как описано здесь ).

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

11
ответ дан 27 November 2019 в 21:12
поделиться

Чем передача сигналов, которую означает NAN, состоит в том, что, когда ЦП встречается с ним, сигнал запущен, (отсюда имя). Если Вы хотите обнаружить неинициализированные переменные, затем повышающие уровень предупреждения на Вашем компиляторе, обычно обнаруживает все пути то использование uninitalized значения. Сбой этого, можно использовать класс обертки, который хранит булевскую переменную, говорящую, инициализируется ли значение:

template <class T>
class initialized {
    T t;
    bool is_initialized;
public:
    initialized() : t(T()), is_initialized(false) { }
    initialized(const T& tt) : t(tt), is_initialized(true) { }
    T& operator=(const T& tt) { t = tt; is_initialized = true; return t; }
    operator T&() {
         if (!is_initialized)
             throw std::exception("uninitialized");
         return t; 
   }
};
9
ответ дан 27 November 2019 в 21:12
поделиться

Можно записать сигнальный NaN в переменную, не инициировав исключение с чем-то вроде этого (nb: непротестированный)

void set_snan( double &d )
{
    long long *bits = (long long *)&d;
    *bits = 0x7ff0000080000001LL;
}

Это будет работать большинство мест, но не, это не 100%-е портативное устройство.

3
ответ дан 27 November 2019 в 21:12
поделиться

Ваша реализация C++ может иметь API для доступа к среде с плавающей точкой, чтобы протестировать на и очистить определенные исключения в операции с плавающей запятой. См. мой ответ на связанный вопрос для получения дополнительной информации.

0
ответ дан 27 November 2019 в 21:12
поделиться

Ну, заботясь об определении и тихого и сигнального NaN, я не могу действительно разобрать различие.

Вы могли использовать код, который используется в тех функциях сами, возможно, он предотвращает исключение тот путь, но видящий исключение в тех двух функциях, я думаю, что он мог бы быть связан с чем-то еще.

, Если Вы хотите непосредственно присвоить NaN:

double value = _Nan._Double;
3
ответ дан 27 November 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: