2015-03-05 2 views
2

Попытка создать функцию для получения точности числовых данных. (Количество цифр справа от десятичной точки)Проблема с символьной длиной символа в R и десятичной точности

decimalplaces <- function(x) { 
      if (x %% 1 != 0) { 
        pattern <- "^([0-9]+)[.]([0-9]+)$" 
        dec_part <- gsub(pattern,"\\2", x)    
        nchar(dec_part) 
      } else { 
        return(0) 
     } 
    } 

Проблема возникает со значениями с более чем 16 цифрами - nchar «принуждает dec_part» в строку, которая может хранить только 16 цифр.

Есть ли способ преодолеть это ограничение в R?

Есть ли альтернативы nchar для цифровых данных?

(R версия 3.1.1 64 бит)

ответ

2

'проблемы' не в nchar, но в gsub, который применяется as.character к несимвольному x. Документация as.character говорит:

as.character представляет действительные и комплексные числа до 15 значащих цифр (технически настроек компилятора в ISO C постоянной DBL_DIG, который будет 15 на машинах, поддерживающими IEC60559 арифметика согласно стандарт C99). Это гарантирует, что все цифры в будут надежными (а не результатом ошибки ), но это означает, что преобразование в символ и обратно в числовое может изменить число. Если вы хотите конвертировать числа в символ с максимально возможной точностью, используйте формат.

Таким образом, вы можете использовать

dec_part <- gsub(pattern,"\\2", format(x,digits=22))  

вместо

dec_part <- gsub(pattern,"\\2", x) 

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

> format(1/3,digits=22) 
[1] "0.3333333333333333148296" 
Смежные вопросы