Cайт веб-разработчика, программиста Ruby on Rails ESV Corp. Екатеринбург, Москва, Санкт-Петербург, Новосибирск, Первоуральск

Целые числа в Ruby

В интернете до сих пор множество устаревшей информации о целых числах в Ruby:

Ruby поддерживает целые числа и числа с плавающей запятой (float numbers). Целые числа могут быть любого порядка (на самом деле они ограничены сверху объемом памяти, выделенным вашей операционной системой). Целые числа внутри диапазона (-2^30, 2^30 — 1) или (-2^62, 2^62 -1) хранятся в двоичной форме и представляют собой экземпляры класса Fixnum. Целые вне этих диапазонов хранятся как экземпляры класса Bignum (в данный момент класс представляет собой множество переменной длины, элементы которого это экземпляры класса Fixnum). Эта разница прозрачна для пользователя и Ruby автоматически конвертирует классы в обе стороны.

ранее это выглядело примерно так:

Fixnum: 81
Fixnum: 6561
Fixnum: 43046721
Bignum: 1853020188851841
Bignum: 3433683820292512484657849089281
Bignum: 11790184577738583171520872861412518665678211592275841109096961

...

источник

# код, показывающий, к какому классу принадлежат большие целые числа
num = 1971

10.times do
  puts "#{num.class}: #{num}"
  num *= num
end

В Ruby 3 (в версии Ruby 2.4 классы Fixnum и Bignum для целых чисел объединили в единый класс Integer) уже нет разделения на Fixnum и Bignum, а только один класс Integer. Вот какой результат выдаёт вышеприведённый код:

Integer: 1971
Integer: 3884841
Integer: 15091989595281
Integer: 227768149944069962177468961
Integer: 51878330128944337514592322989614052566394196118419521
Integer: 2691361136967733803053442872120669874530032700593141543312687379088945783901537422048858789023414953869441
Integer: 7243424769580252791999537267615857361956265756124479635088467872616248900867128603578363947111884994278325989972344071397914345208068758916986062166523435531349863180740630594850101023855762798606050058473652481
Integer: 52467202392568738253038399864197823846014332394936153380172160277984470975203187992181749822957096729181780360732714071900375646393562509324515210216005307817639301067149878878050805514796568863667644247448569731889835640698666572076716104784383518159341719441041552329024420778836167399592742267861414673072384730368174604400366834634298365914142332363042139666979472850273325578590005191425712216321267388134468757455361
Integer: 2752807326902770731724799932445854247861955730306492746783014842943791346981485349678269829547821011615777484719537649545690246821906430071251789809392447974371131001626523601078949129333899683425437173057800898137531932906843538247248162888232660411964493027015012112935821184839032760940041149698265965890575879405849608075835760411286427811923926036779785591806640053792312409359543470606104020307947634161691304252924048909320024979611551561098076565741344627227994416492879841468094434422091937974771455869921320726927986911260615824726720906176708762005824914273887285459412175599988011333897339261512638410124467735083755623565413115254030724706486043642463239182724544994386948689513601521718142274235427202664662837614854965926792094803658365855441230678846114970176640393738659128419014465008217674821901748612556865724704519907640321
Integer: 7577948179049578044795814733901436034896346998747887722160454333926679688631400366869232270047558340907753692451694263775443085293272478253718222118025605453631687036179230985807811725072041547431260855139403185297484232077404755773014920885049527687815132751651430147331987561151687882109512696112152083568251727593029966494224353567846876309724512947314221588031952870133499038255563011734251763005888575026698047364143414432804580088894965566918636036421904698085011740874850086163945024188695389277902639700819950826943467964996046951553805312472370967206319940274231751882728117373676252740438589193302582162948636580490188737483916142967056186627360544504952409919646774500167779979404529552284051022150025245492302130859077650722224771311041868249765596514005073815466034098831324156666512470099161138030386406111698773256416256237630594982630573567311988304029014435400640225873594280513581964774649506962504136874330304134942975723564870759413823604596787342175978441232023992701674437247183731570868298077819795226256051235227532123650704078484939987839166828079656306571068779594795963637044797496731335584049828145827122869586589171168618077270473336509164895810907491330621278984060381534359289362915899675523171977347372246699816622964902158632805726167696688229312489677930759323338214919321486540720575768479749773798490658347522099897083272349160139670900614464124788234284400879343633830156956588999220817062742863259027808898852612446582090851702144896297457466794961781103047848354421562443975822863222806029104010100808672564220926260761364495779604664664036832934812091217343765697056065769750156650963109717105766639303672121147827467346333270776334432150304983041

Впечатляет, не правда ли? Какой другой язык программирования может похвастаться реализацией работы с большими целыми числами на базовом уровне, реализованном в самом языке программирования? Это ещё раз показывает, что язык Ruby создан для людей, а не для машин - программист решает поставленную задачу, не отвлекаясь на то, как это будет представлено внутри компьютера - уже не надо задумываться об ограничениях, накладываемых разрядностью процессора, например.