Странный вывод в последнем списке значений - PullRequest
0 голосов
/ 12 сентября 2011

Я перебираю список, который содержит 4 списка. Ниже приведен вывод, который я получаю, мне интересно, почему я получаю это с точностью, например, почему не первый просто 1,00, как в других случаях?

[[1]]
 [1] 1.00 0.96 0.84 0.74 0.66 0.56 0.48 0.36 0.26 0.16 0.06 0.00

[[2]]
 [1] 1.00 0.98 0.84 0.74 0.66 0.56 0.48 0.38 0.26 0.16 0.06 0.00

[[3]]
 [1] 1.00 0.94 0.84 0.74 0.66 0.56 0.48 0.36 0.26 0.16 0.06 0.00

[[4]]
 [1] 1.000000e+00 9.400000e-01 8.400000e-01 7.400000e-01 6.600000e-01 5.800000e-01 4.600000e-01 3.600000e-01 2.600000e-01 1.600000e-01 6.000000e-02 1.110223e-16

Ответы [ 3 ]

2 голосов
/ 12 сентября 2011

Как я прокомментировал, когда вы впервые опубликовали его в качестве дополнительного комментария к своему предыдущему вопросу, это скорее проблема отображения.Последнее число фактически равно нулю:

R> identical(0, 1.1e-16)
[1] FALSE
R> all.equal(0, 1.1e-16)
[1] TRUE
R> 

Хотя его двоичное представление не равно нулю, в большинстве случаев оно оценивается как нечто достаточно близкое.Таким образом, вы можете запустить фильтр для ваших данных и заменить «почти нули» на ноль, или вы можете отладить код и посмотреть, как / почему он получается ненулевым.

Также см. R FAQ иобщие ссылки на вопросы, связанные с вычислениями с плавающей запятой.

1 голос
/ 12 сентября 2011

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

lapply( mylist, round, digits=2)

Преимущество этого подхода состоит в том, что он возвращает значения числового режима, которые не выполняются вызовом format (), итакже может использоваться с цифровыми характеристиками, которые являются «длинными» и могут быть эффективными «нулевыми фильтрами»:

lapply(list(c(1,2), c(1.000000e+00, 9.400000e-01, 6.000000e-02, 1.110223e-16 )), round, 

digits=13)
[[1]]
[1] 1 2

[[2]]
[1] 1.00 0.94 0.06 0.00
0 голосов
/ 12 сентября 2011

Я не уверен в точном алгоритме, который R использует для выбора формата. Понятно, что для всех значений в каждом списке используется один формат. Также ясно, что последний список содержит значения совершенно разных порядков: 1.000000e+00 и 1.110223e-16. Поэтому я думаю, что разумно, чтобы R решил напечатать последний список, используя научную запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...