2015-09-20 3 views
10

Я пытаюсь понять принуждение обоснование двойников:Каково обоснование двойного принуждения?

as.logical(c(-1, -0.01, 0, 0.01, 0.1,1:10)) 
#> [1] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
#> [12] TRUE TRUE TRUE TRUE 

я могу видеть, что принуждение происходит на скаляр (знак не имеет значения) и , что только точно 0 принуждается к FALSE. Я был удивлен этим, , похоже, нет понятия «ближе всего ...» или округления до 0L или 1L. Мне любопытно, почему.

Я старался охотиться за проницательностью here но без успеха.

Я также рассмотрел this related question.

Может кто-нибудь объяснить, почему я должен ожидать, что каждая из вышеуказанных проверенных значений принуждает, как они это делают?

ответ

13

Я предполагаю, что это наследуется от C, например. от here:

В С истинным представлен любым числовым значением, не равным 0, и ложным представлен 0

Также см, например, here; на данный момент я не могу найти лучшего источника для официальной спецификации языка.

Пиратская копия Kernighan и Ritchie 2d ed. Я нашел онлайн (я бы предпочел не ссылаться на него). 50, раздел 3.2, «If-Else» (выделено мной):

Выражение оценивается; если это правда (, то есть если выражение имеет ненулевое значение), выполняется инструкция 1. Если оно ложно (выражение равно нулю), и если есть часть else, вместо этого выполняется инструкция 2.

@hrbrmstr указывает на то, что внутреннее определение R Логических, который используется для преобразования в Rinternals.h:

#define LOGICAL(x) ((int *) DATAPTR(x)) 
+0

Я полагаю, тогда возникает вопрос, почему это логическое обоснование, когда это определено в 'C'! – npjc

+2

@npjc: [Потому что, математика.] (Https://en.wikipedia.org/wiki/Boolean_algebra) :) –

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