Подтвердить что ты не робот

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

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

Во-первых, мои настройки 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?

4b9b3361

Ответ 1

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

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

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

В третьем случае фиксированная нотация более широкая (т.е. "более чем на 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

Ответ 2

Я в замешательстве, что именно ваш вопрос; или, более конкретно, как вы будете использовать ответ на этот вопрос, чтобы каким-то образом изменить/контролировать поведение 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