Skip to main content
LibreTexts - Ukrayinska

3.3: Розширення цілих чисел, тип BigInt

  • Page ID
    67157
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    У розділі 8 ми вивчимо прості числа, і вони зазвичай перевищують максимально допустимий Int64 або навіть Int128. Якщо це необхідно, існує тип під назвою BigInt без максимуму або мінімуму. Число googol - це те\(10^{100}\), що ці два цілих типи не будуть утримуватися. Однак, якщо ми введемо

    big(10)^100
    10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    який 1, а потім 100 нулів жахливо великий. Примітка: команда big створює BigInt і, як правило, звичайні операції з цілими числами призводять до BigInTS, а також. Примітка: якщо ви думаєте, що сталася помилка з googol, Google «googol».

    Дуже важливо розуміти, як працює великий (10) ^100. Спочатку робиться число типу BigInt зі значенням 10. Тоді це піднімається до 100-ї влади. Як зазначалося вухо- lier, BigInt не має верхньої або нижньої межі на число. Він може рости в міру необхідності.

    Спроба ввести великий (10 ^ 100) нижче.

     
     

     

    Результат дорівнює 0, що має бути дивним, однак зауважте, що через порядок операцій спочатку 10^100 обчислюється в стандартному Int64, а потім перетворюється на BigInt. Знову ж таки, для отримання детальної інформації про те, що тут відбувається, подивіться на Додаток C, коротше кажучи, це постійно множить число десять, 100 разів, що призводить до переповнення і, як такий, призводить до 0.

    Рекомендується використовувати тільки BigInt, якщо це необхідно. Як ми побачимо в розділі 8, операції з ними значно повільніші, ніж Int64 або навіть Int128. У кількох випадках робити це потрібно. Наприклад, у цій пізній главі з простими числами.

     

    Тип даних Big Float

    Давайте повернемося до прикладу з розділу XXXX і підсумуємо 1/9 дев'ять разів. Нагадаємо, що

    1/9+1/9+1/9+1/9+1/9+1/9+1/9+1/9+1/9
    1.0000000000000002

    який показує обмеження типу з плаваючою комою. Тип даних BigFloat є більш гнучким. Однак зауважте, що

    a=big(1/9)
    0.111111111111111104943205418749130330979824066162109375

    який, здається, має точність лише 17 цифр, що характерно для 64-бітної з плаваючою комою, тому, здається, нічого не покращило. Це, як і вище, є випадком обережності при побудові BigFloat. Що відбувається з великим (1/9)? Одягніть шапку для замовлення операцій і погляньте. 1/9 робиться першим, і оскільки обидва 1 і 9 є регулярними цілими числами (Int64), результатом є Float64. Тоді велика функція перетворює Float64 на BigFloat, але не ми очікували точності.

    Замість цього, якщо ми визначимо

    a=big(1)/big(9)
    0.1111111111111111111111111111111111111111111111111111111111111111111111111111109

    що більше схоже на очікуваний результат. Щоб визначити кількість цифр точності, можна порахувати (болісно) або спробувати

    length(string(a))
    81

    що приблизно в 5 разів перевищує точність Float64. Примітка: знову дивлячись на порядок операцій, команда length (string (a)) спочатку приймає число a і повертає його як рядок. Потім працюючи всередині назовні, знайдіть довжину рядка.

    Функція точності, яка використовується для змінної типу BigFloat, покаже точність змінної. Таким чином

    precision(a)
    256

    яка кількість бітів точності, і вона має 4 рази двійкову точність Float64, але приблизно в 5 разів перевищує десяткову точність.

     

    Як зазначалося на початку цього розділу, хоча, якщо ми хочемо обчислити\(\pi\) до 1 мільйона десяткових цифр, те, що ми бачили до цих пір тільки близько 80 цифр точності. Як трохи спокуса, ми зробимо це в розділі XXX.

    Тип BigFloat досить гнучкий. Наведений вище приклад використовував його в точності за замовчуванням. Ми можемо змінити це за допомогою функції setprecision. Наприклад:

      setprecision(2^10)
    1024

    показуючи, що тепер BigFloats буде зберігатися в цій кількості бітів. Таке число буде використовувати 16 разів кількість двійкових цифр як Float64. Введення

    a2=big(1)/big(9)
    0.111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

    число, яке, на перший погляд, схоже, зберігає приблизно в 4 рази більше кількості цифр, як розмір за замовчуванням BigFloat. Для визначення загальної кількості десяткових знаків, якщо ми введемо

    length(string(big(a2)))
    311

    як кількість десяткових знаків. Це приблизно в 20 разів перевищує точність Float64.

    • Was this article helpful?