Почему силы 10 печатаются в научной записи в 5-й степени?

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

Во-первых, мой scipen а также digits настройки

unlist(options("scipen", "digits"))
# scipen digits 
#      0      7 

Теперь, 10 степеней печатаются обычно до 4-й степени, а затем печать переключается на научную запись в 5-й степени.

10^(1:4)
# [1]    10   100  1000 10000
10^(1:5)
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05

Интересно, что это не происходит для некоторых других чисел больше 10.

11^(1:5)
# [1]     11    121   1331  14641 161051

Судя по следующему, 5 цифр кажутся значительными.

100^(1:2)
# [1]   100 10000
100^(1:3)
# [1] 1e+02 1e+04 1e+06

Итак, мои вопросы:

Почему научная запись активируется между 4-й и 5-й степенью для 10, а не для других чисел? Номер 5 значим? Кроме того, почему 5, а не число ближе к параметру максимальных цифр 22?

2 ответа

Решение

Ну, ответ на самом деле есть в определении scipen в ?optionsхотя довольно сложно понять, что это значит, не играя с некоторыми примерами:

'scipen': целое число. Штраф, применяемый при принятии решения о печати числовых значений в фиксированной или экспоненциальной записи. Положительные значения смещены в сторону фиксированных значений, а отрицательные - в сторону научных обозначений: предпочтительнее использовать фиксированные обозначения, если они не превышают цифры "scipen".

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

В третьем случае, тем не менее, фиксированная запись шире (т. Е. "На 0 цифр шире"), поскольку 5 нулей означают больше символов, чем 4 символа, используемых для представления того же значения с использованием e+nn, В результате, в этом случае научное обозначение является предпочтительным.

1e+03
1000
# [1] 1000

1e+04
10000
# [1] 10000

1e+05
100000      ## <- wider
# [1] 1e+05

Далее рассмотрим некоторые числа, которые также заканчиваются множеством нулей, но представление которых в научной записи потребует использования ., Для этих чисел будет использоваться научная запись, если у вас есть 6 или более нулей (то есть более 5 символов, занятых одним . и персонажи e+nn).

1.1e+06
1100000
# [1] 1100000


1.1e+07
11000000     ##  <- wider
# [1] 1.1e+07

Рассуждение о компромиссе становится немного сложнее для большинства других чисел, для которых значения обоих options("scipen") а также options("digits") вступать в игру, но общая идея точно такая же.

Чтобы увидеть некоторые немного удивительные сложности, которые могут возникнуть, вы можете вставить следующее в свою консоль (возможно, после первой попытки предсказать, где в каждой серии произойдет переключение на научную запись).

100001
1000001
10000001
100000001
1000000001
10000000001
100000000001
1000000000001

111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111

Я запутался в том, что именно твой вопрос; или, более конкретно, как бы вы использовали ответ на этот вопрос, чтобы каким-то образом изменить / контролировать поведение R. Вы пытаетесь форматировать числа определенным образом? Есть лучшие способы сделать это.

Когда вы вводите такие значения, результаты запускаются неявно, хотя один из print() Команды должны быть отформатированы "приятно" на консоли. Всякий раз, когда на экране все выглядит "красиво", код для этого часто бывает уродливым. Здесь большая часть этого кода выполняется функцией formatReal и вспомогательной научной функцией. Последний отслеживает следующую информацию для номера

/* for a number x , determine
 *  sgn    = 1_{x < 0}  {0/1}
 *  kpower = Exponent of 10;
 *  nsig   = min(R_print.digits, #{significant digits of alpha})
 *  roundingwidens = 1 if rounding causes x to increase in width, 0 otherwise
 *
 * where  |x| = alpha * 10^kpower   and  1 <= alpha < 10
 */

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

print() предназначен только для того, чтобы все выглядело "красиво". Что именно хорошо, зависит от всех значений в векторе. В этом коде вы найдете несколько жестких ограничений; это очень адаптивно. Нет простого способа кратко описать все, что он делает в общем случае (что звучит так, как вы просите).

Единственное, что можно сказать наверняка, это то, что если вам нужно отформатировать свои номера определенным образом, используйте такую ​​функцию, как sprintf() или же formatC() это позволяет для точного контроля.

Конечно, это поведение зависит от class() и я указал на formatReal вещи, так как именно здесь происходят самые сложные вещи. Но обратите внимание, когда вы используете целые числа

c(10, 100, 1000, 10000, 100000)
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05
c(10L, 100L, 1000L, 10000L, 100000L)
# [1]     10    100   1000  10000 100000
Другие вопросы по тегам