В R я нахожу какое-то странное поведение, которое я не могу объяснить, и я надеюсь, что кто-то здесь сможет. Я считаю, что значение 100! это большой номер.
Несколько строк из консоли показывают ожидаемое поведение...
>factorial( 10 )
[1] 3628800
>prod( 1:10 )
[1] 3628800
> prod( as.double(1:10) )
[1] 3628800
> cumprod( 1:10 )
[1] 1 2 6 24 120 720 5040 40320 362880 3628800
Однако, когда я пробую 100! Я получаю (заметьте, как результирующие числа начинают различаться в 14 цифр):
> options(scipen=200) #set so the whole number shows in the output
> factorial(100)
[1] 93326215443942248650123855988187884417589065162466533279019703073787172439798159584162769794613566466294295348586598751018383869128892469242002299597101203456
> prod(1:100)
[1] 93326215443944102188325606108575267240944254854960571509166910400407995064242937148632694030450512898042989296944474898258737204311236641477561877016501813248
> prod( as.double(1:100) )
[1] 93326215443944150965646704795953882578400970373184098831012889540582227238570431295066113089288327277825849664006524270554535976289719382852181865895959724032
> all.equal( prod(1:100) , factorial(100) , prod( as.double(1:100) ) )
[1] TRUE
Если я сделаю некоторые тесты против переменной, установленной в "известное" число 100! то я вижу следующее:
# This is (as far as I know) the 'true' value of 100!
> n<- as.double(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000)
> factorial(100) - n
[1] -1902315522848807765998160811905210717565551993186466795054798772271710903343294674760811531554315419925519536152107160826913610179566298858520576
> prod(1:100) - n
[1] -48777321098687378615337456715518223527321845979140174232174327494146433419058837814379782860367062049372295798771978482741374619988879457910784
> prod(as.double(1:100)) - n
[1] 0
Конечный результат оценивается в ноль, но число, возвращаемое для prod( as.double( 1:100 ) )
, не отображается так, как я ожидал бы, даже если он правильно оценивает prod( as.double( 1:100 ) ) - n
, где n
- это переменная, установленная на значение 100!.
Может ли кто-нибудь объяснить это поведение мне, пожалуйста? Насколько я знаю, это не должно быть связано с переполнением и т.д., Поскольку я использую систему x64. Версия и информация о машине ниже:
> .Machine$double.xmax
[1] 1.798e+308
> str( R.Version() )
List of 14
$ platform : chr "x86_64-apple-darwin9.8.0"
$ arch : chr "x86_64"
$ os : chr "darwin9.8.0"
$ system : chr "x86_64, darwin9.8.0"
$ status : chr ""
$ major : chr "2"
$ minor : chr "15.2"
$ year : chr "2012"
$ month : chr "10"
$ day : chr "26"
$ svn rev : chr "61015"
$ language : chr "R"
$ version.string: chr "R version 2.15.2 (2012-10-26)"
$ nickname : chr "Trick or Treat"
Может кто-нибудь объяснить это мне? Я не сомневаюсь, что R делает все правильно, и это, скорее всего, связано с R. Вы можете указать, что поскольку prod( as.double( 1:100 ) ) - n
правильно оценивает, о чем я беспокоюсь, но я делаю Project Euler Проблема 20, поэтому мне нужно было отобразить правильные цифры.
Спасибо