Кажется, у меня есть проблема округления с SAS PROC FORMAT - PullRequest
2 голосов
/ 30 сентября 2011

Похоже, у меня проблема с округлением в SAS PROC FORMAT. Код как ниже:

формат proc; значение testf -1.85E-13--1.85E-13 = «отрицательно» 0-0 = «ноль»; бежать;

проверка данных; введите номер best32 .; карты; 0 ; бежать;

данные теста2; установить тест; формат варлабел $ 50 .; varlabel = put (число, testf.); бежать;

Код прост: сначала создайте формат с двумя вариантами: отрицательное число действительно закрыто до нуля и само ноль. Во-вторых, создайте тест набора данных с одним наблюдением, числовая переменная которого равна 0. В-третьих, создайте другой набор данных с примененным форматом. Я ожидаю увидеть test2 с номером = 0 и varlabel = «ноль», но на самом деле я вижу test2 с номером = 0 и varlabel = «отрицательный». Кто-нибудь знает, почему и как решить эту проблему? Очень ценю за любое предложение / помощь.

1 Ответ

5 голосов
/ 30 сентября 2011

Это проблема точности с плавающей запятой. При тестировании значений с плавающей запятой на равенство SAS использует значение «fuzz» 1e-12 (по умолчанию). Выражение a = b оценивается как истинное, если abs (a-b) <1e-12. В вашем случае, 1.85e-13 достаточно близко к нулю, чтобы SAS дал ему формат «отрицательный» (почему он всегда присваивает это, а никогда «ноль», я не знаю). </p>

Один из способов справиться с этим - уменьшить значение fuzz, которое SAS ассоциирует с вашим форматом:

proc format; 
  value testf (fuzz=1E-13) -1.85E-13--1.85E-13 = 'negative' 0-0 = 'zero'; 
run;

Этот формат присваивает ожидаемому varlabel 'ноль'.

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

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

...