3.3: Розширення цілих чисел, тип BigInt
- Page ID
- 67157
У розділі 8 ми вивчимо прості числа, і вони зазвичай перевищують максимально допустимий Int64
або навіть Int128
. Якщо це необхідно, існує тип під назвою BigInt
без максимуму або мінімуму. Число googol - це те\(10^{100}\), що ці два цілих типи не будуть утримуватися. Однак, якщо ми введемо
який 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 дев'ять разів. Нагадаємо, що
який показує обмеження типу з плаваючою комою. Тип даних BigFloat
є більш гнучким. Однак зауважте, що
який, здається, має точність лише 17 цифр, що характерно для 64-бітної з плаваючою комою, тому, здається, нічого не покращило. Це, як і вище, є випадком обережності при побудові BigFloat
. Що відбувається з великим (1/9)
? Одягніть шапку для замовлення операцій і погляньте. 1/9 робиться першим, і оскільки обидва 1 і 9 є регулярними цілими числами (Int64
), результатом є Float64
. Тоді велика функція перетворює Float64
на BigFloat
, але не ми очікували точності.
Замість цього, якщо ми визначимо
що більше схоже на очікуваний результат. Щоб визначити кількість цифр точності, можна порахувати (болісно) або спробувати
що приблизно в 5 разів перевищує точність Float64
. Примітка: знову дивлячись на порядок операцій, команда length (string (a))
спочатку приймає число a
і повертає його як рядок
. Потім працюючи всередині назовні, знайдіть довжину рядка.
Функція точності
, яка використовується для змінної типу BigFloat
, покаже точність змінної. Таким чином
яка кількість бітів точності, і вона має 4 рази двійкову точність Float64
, але приблизно в 5 разів перевищує десяткову точність.
Як зазначалося на початку цього розділу, хоча, якщо ми хочемо обчислити\(\pi\) до 1 мільйона десяткових цифр, те, що ми бачили до цих пір тільки близько 80 цифр точності. Як трохи спокуса, ми зробимо це в розділі XXX.
Тип BigFloat
досить гнучкий. Наведений вище приклад використовував його в точності за замовчуванням. Ми можемо змінити це за допомогою функції setprecision
. Наприклад:
показуючи, що тепер BigFloats
буде зберігатися в цій кількості бітів. Таке число буде використовувати 16 разів кількість двійкових цифр як Float64
. Введення
число, яке, на перший погляд, схоже, зберігає приблизно в 4 рази більше кількості цифр, як розмір за замовчуванням BigFloat
. Для визначення загальної кількості десяткових знаків, якщо ми введемо
як кількість десяткових знаків. Це приблизно в 20 разів перевищує точність Float64
.