muszę być w stanie określić maksymalną liczbę całkowitą układów na Ruby. Czy ktoś wie jak, a może jest to możliwe?Ruby maksymalna całkowita
Odpowiedz
Ruby automatycznie konwertuje liczby całkowite do dużej klasy całkowitej kiedy przelewem, więc nie ma (prawie) bez limitu, jak duże mogą one być.
Jeśli szukasz rozmiaru urządzenia, czyli 64- lub 32-bit, znalazłem this trick at ruby-forum.com:
machine_bytes = ['foo'].pack('p').size
machine_bits = machine_bytes * 8
machine_max_signed = 2**(machine_bits-1) - 1
machine_max_unsigned = 2**machine_bits - 1
Jeśli szukasz rozmiaru obiektów Fixnum (całkowitymi dosyć mały zapisz w jednym słowie maszynowym), możesz zadzwonić pod numer 0.size
, aby uzyskać liczbę bajtów. Przypuszczam, że powinno to być 4 na 32-bitowych kompilacjach, ale nie mogę tego teraz przetestować. Również największa Fixnum widocznie 2**30 - 1
(lub 2**62 - 1
), ponieważ jeden bit jest używana aby oznaczyć go jako integer zamiast odwołania do obiektu.
Ruby Fixnums automatycznie przekształca się Bignums.
Aby znaleźć najwyższy Fixnum można zrobić coś takiego:
class Fixnum
N_BYTES = [42].pack('i').size
N_BITS = N_BYTES * 8
MAX = 2 ** (N_BITS - 2) - 1
MIN = -MAX - 1
end
p(Fixnum::MAX)
Bezwstydnie zgrane z ruby-talk discussion. Poszukaj tam więcej szczegółów.
Jeśli użyjesz 'puts (Fixnum :: MAX + 1) .class', to nie zwróci' Bignum', jak mogłoby się wydawać. Jeśli zmienisz "8" na "16", to będzie. –
to nie jest dostępne teraz – allenhwkim
Czytając przyjazną podręcznik? Kto by chciał to zrobić?
start = Time.now
largest_known_fixnum = 1
smallest_known_bignum = nil
until smallest_known_bignum == largest_known_fixnum + 1
if smallest_known_bignum.nil?
next_number_to_try = largest_known_fixnum * 1000
else
next_number_to_try = (smallest_known_bignum + largest_known_fixnum)/2 # Geometric mean would be more efficient, but more risky
end
if next_number_to_try <= largest_known_fixnum ||
smallest_known_bignum && next_number_to_try >= smallest_known_bignum
raise "Can't happen case"
end
case next_number_to_try
when Bignum then smallest_known_bignum = next_number_to_try
when Fixnum then largest_known_fixnum = next_number_to_try
else raise "Can't happen case"
end
end
finish = Time.now
puts "The largest fixnum is #{largest_known_fixnum}"
puts "The smallest bignum is #{smallest_known_bignum}"
puts "Calculation took #{finish - start} seconds"
To wydaje się być jedyną odpowiedzią, która zwraca liczby na przejściu od Fixnum do Bignum, które dla mnie, oznacza, że jest to największy Fixnum w Ruby. –
FIXNUM_MAX = (2**(0.size * 8 -2) -1)
FIXNUM_MIN = -(2**(0.size * 8 -2))
Dlaczego oddzieliłeś 2 bity zamiast 1 dla znaku? Testowałem to i wydaje się, że jest poprawne, ale dlaczego Ruby używa 2 bitów do znaku? – Matthias
@Matthias Dodatkowy bit jest używany do oznaczania wartości jako liczby całkowitej (w przeciwieństwie do wskaźnika do obiektu). –
Interesujące, dzięki! – Matthias
jak @ Jörg W Mittag zauważył: w jruby, ustalić rozmiar num jest zawsze długość 8 bajtów. Ten fragment kodu pokazuje prawdę:
fmax = ->{
if RUBY_PLATFORM == 'java'
2**63 - 1
else
2**(0.size * 8 - 2) - 1
end
}.call
p fmax.class # Fixnum
fmax = fmax + 1
p fmax.class #Bignum
- 1. Jaka jest maksymalna wartość całkowita w Flex?
- 2. Maksymalna długość na polu tekstowym w Ruby on Rails
- 3. Maksymalna długość wektora w R
- 4. Ciągła liczba całkowita działa
- 5. całkowita emisja Rodzaj obsady
- 6. długość całkowita w javascript
- 7. Całkowita wielkość magazynu MongoDB
- 8. Konwersja liczba całkowita base36
- 9. Dlaczego funkcja jest całkowita
- 10. Sprawdź, czy wzrosła wartość całkowita?
- 11. Liczba całkowita do tablicy binarnej
- 12. Najbliższa liczba całkowita z podziałem
- 13. R: liczba całkowita kontra numeryczna
- 14. Wartość całkowita w zasobach WPF?
- 15. Arbitralna długość całkowita w Ada
- 16. VBA Data jako liczba całkowita
- 17. Losowa liczba całkowita z warunkami
- 18. Oracle numer Format modelu Maksymalna długość
- 19. Maksymalna liczba argumentów Bash! = Maksymalna liczba argumentów cp?
- 20. Maksymalna liczba wątków ThreadPool
- 21. Maksymalna długość ** parametrów argv
- 22. Maksymalna długość bajtu []?
- 23. ConvertFrom-Json maksymalna długość
- 24. Maksymalna precyzja poniżej nieograniczonej?
- 25. Maksymalna długość tytułu Atrybut
- 26. SQLAlchemy - maksymalna długość kolumny
- 27. Maksymalna wartość unsigned char
- 28. Maksymalna długość zapytania SQL
- 29. Maksymalna wartość pierwszej kolumny
- 30. Maksymalna długość kolejki scala
Na pewno chcesz 2 ** (machine_size * 8) -1; 2 ** 4-1 = 15, co nie jest niczym dużym. – Cebjyre
Ups, myślę, że zacząłem za dużo myśleć o bajtach zamiast bitach. –
OSTRZEŻENIE: Kod jest bezużyteczny. Przeczytaj edycję, zignoruj kod. Nie znajdzie maksymalnego niczego dla Ruby. Znajduje kod, który nie używa oznaczonych wskaźników. –