2016-07-30 3 views
2

Обычно говорят, что «SAS missing values ​​equal минус бесконечность». Но есть проблема с этим утверждением, так как может быть 27 или 28 «ароматов» отсутствующих значений (по умолчанию . и .a - .z и ._), каждый из которых имеет предопределенный порядок сортировки.Как SAS отличается отсутствием значений без пропусков?

Поскольку она не может быть, что некоторые бесконечности больше, чем другие, я пришел к пониманию, что:

  1. Отсутствующих значения рассматриваются как минус бесконечности по сравнению с действительными числовыми данными, и что
  2. По сравнению с другими пропущенными значениями они ранжируются с другим набором предопределенных правил.

Итак, мой вопрос: на самом низком уровне, как SAS хранит числовые данные таким образом, чтобы он мог отличить отсутствующие из числа без пропущенных числовых значений? Есть ли бит «недостатка», как есть «бит знака»?

+0

Это на самом деле не хранить отрицательную бесконечность явно в памяти. Это просто рассматривается как отрицательная бесконечность в операциях. С несколькими недостающими значениями он существенно разрывает связь в зависимости от типа отсутствующего значения. – Carl

+0

И некоторые бесконечности больше других. Попробуйте подсчитать каждое натуральное число против подсчета каждого действительного числа в [0,1] – Carl

+0

Не на компьютере, чтобы проверить, но я считаю, что все числа удваиваются, даже пропущенные значения. Я думаю, что они представляют последние 27 (или 28) целых чисел в представлении с плавающей запятой двойной точности IEEE. Есть '.'> или <' ._'? – DomPazz

ответ

3

SAS хранит номера как значения с плавающей запятой, используя 64-битный формат IEEE. Они выбрали 28 конкретных комбинаций бит и использовали их для представления., ._ и .a до .z. По соглашению они заказываются ._ to. to .a to .z. Я не уверен, были ли выбраны значения, чтобы было легче протестировать этот заказ или если заказ был случайным для конкретных битовых шаблонов, которые они использовали.

Вы можете посмотреть на битовые шаблоны, используемые для подглядывания в значения, которые хранятся.

data _null_; 
    length i 8 str $8 ; 
    do i=._,.,.a,.z,constant('small'),0,1,constant('big'); 
    str=peekclong(addrlong(i)); 
    str=reverse(str); 
    put i best12. @15 i hex16. @35 str $hex16. ; 
    end; 
run; 

результат

  _     _ FFFFFF0000000000 
      .     . FFFFFE0000000000 
      A     A FFFFFD0000000000 
      Z     Z FFFFE40000000000 
2.22507E-308 0010000000000000 0010000000000000 
      0 0000000000000000 0000000000000000 
      1 3FF0000000000000 3FF0000000000000 
1.797693E308 7FEFFFFFFFFFFFFF 7FEFFFFFFFFFFFFF 
+0

Хорошо, если вы удалите два первых предложения (я уверен, что вы можете понять, почему я говорю это), я мог бы принять это как ответ. –

+1

Первое предложение относится к первому абзацу вопроса. – Tom

+1

Я сформулировал ответ. – Tom

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