Skip to main content
LibreTexts - Ukrayinska

3.2: числа з плаваючою комою

  • Page ID
    67147
  • \( \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}}\)

    Багато полів у наукових обчислень покладаються на використання десяткових знаків, і стандартний спосіб зберігання їх у комп'ютері - з числами з плаваючою комою. Детальна інформація про числа з плаваючою комою наведена в Додатку XXXX. Джулія має 16-,32- та 64-розрядні числа з плаваючою комою під назвою Float16, Float32 та Float64, і за замовчуванням у більшості систем є Float64.

    Існує два обмеження для будь-якого числа з плаваючою комою. По-перше, кількість цифр, що зберігаються в числі, а по-друге, максимальне і мінімальне значення. Кожен вбудований тип розділяє кількість бітів на зберігання обох, і між ними існує баланс. Емпіричне правило полягає в тому, що

    Float16 зберігає 4 десяткові цифри, а максимум становить близько 32 000.

    Float32 зберігає 8 десяткових знаків, а макс становить близько\(10^{38}\).

    Float64 зберігає 16 десяткових цифр, а макс становить близько\(10^{307}\)

    Ми можемо використовувати функцію bitstring в julia, щоб знайти двійкове подання. Зауважте, що

    bitstring(Float16(8.625))
    "0100100001010000"

    Знову ж таки, деталі знаходяться в Додатку XXXXX, але, коротше кажучи, число з плаваючою комою зберігається в науковому позначенні з абсцисою, показником та знаком, об'єднаним разом.

    На відміну від цілих чисел, більшість чисел не можна зберігати точно з числом з плаваючою комою. Наприклад, 1/3 ділить 1 на 3 і призводить до числа з плаваючою комою, близьким до дробу\(\frac{1}{3}\). У юлії це 0.33333333333333333333 а також зауважте, що

    bitstring(1/3)
    "0011111111010101010101010101010101010101010101010101010101010101"

    Зверніть увагу, що є ненульові біти по всьому числу в цьому випадку, що не відбулося з 8.625. Це пояснюється тим, що як дріб 8.625 має знаменник 8, який є степеню 2. Якщо дріб може бути записаний з таким знаменником, число у двійковому рядку має 0, що накладає правий кінець числа.

    Що це має значення? Розглянемо наступне:

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

    не 1, очікуваний результат. Це приклад обмежень чисел з плаваючою комою і 1) або ми маємо справу з цим, або 2) використовуємо інший тип даних (у цьому випадку краще було б або BigFloat, або Rational).

    Примітка: Це сталося тому, що найближча з плаваючою комою до дробу 1/9 була трохи вище 1/9, а додавання 9 з цих чисел призводить до додаткової кількості

    Якщо ви не знаєте, що у вас є причини обрати інше, виберіть Float64 для більшості чисел з плаваючою комою. З ним все ще існують помилки підтоку та переповнення, але, як ми побачимо в розділі XXXXX, загалом помилка округлення, пов'язана з числом з плаваючою комою, є більш згубною для обчислень.