Фіксована точка проти номера з плаваючою комою


109

Я просто не можу зрозуміти номери фіксованої точки та плаваючої крапки через важкі для читання визначення в них по всьому Google. Але жодне, що я прочитав, не дає достатньо простого пояснення того, що вони є насправді. Чи можу я отримати просте визначення з прикладом?


У мене також виникають проблеми з пошуком хорошого визначення. Головне, що я шукаю, - це те, що допоможе мені зрозуміти ці результати: 3,11 + 42,0 = 45,110001 (не 45,11), 3,12 + 42,0 = 45,119999 (не 45,12), 3,15 + 42,0 = 45,150002 (не 45,15).
Барт С.

1
Я думаю, що це відповідна дискусія (особливо, описуючи пастки з плаваючими числами та кращу точність з фіксованою точкою, і чому ви ніколи не хочете отримувати гроші як поплавок. Stackoverflow.com/questions/6320209/…
Ендрю Норман

Випадкове посилання, де згадуються теми "OpenGL® ES OpenGL ES включає профілі для систем з плаваючою точкою та фіксованою точкою та специфікацію EGL ™ ..."
Red Pea

Відповіді:


145

Номер фіксованої точки має конкретну кількість біт (або цифр), відведених для цілої частини (частина ліворуч від десяткової крапки) та певну кількість бітів, зарезервованих для дробової частини (частина праворуч від десяткової бал). Незалежно від того, наскільки великою чи малою є ваша кількість, вона завжди використовуватиме однакову кількість біт для кожної порції. Наприклад, якби ваш формат фіксованої точки був у десятковій формі, IIIII.FFFFFто найбільше число, яке ви могли б представляти, було б 99999.99999і найменше ненульове число 00000.00001. Кожен біт коду, який обробляє такі числа, повинен мати вбудовані знання про те, де знаходиться десяткова крапка.

Число з плаваючою комою не резервує конкретну кількість бітів для цілої частини або дробової частини. Натомість він залишає певну кількість біт для числа (називається mantissa або significand ) і певну кількість біт, щоб сказати, де в межах цього числа десяткове місце сидить (називається експонентом ). Таким чином, число з плаваючою комою, що містить 10 цифр з двома цифрами, зарезервованими для експонента, може представляти найбільше значення 9.9999999e+50і найменше ненульове значення 0.0000001e-49.


8
Ну ви забуваєте, що цифри з плаваючою комою майже завжди підписуються, тому мінімальне значення дійсно було б -9.9999999e+50.
Брайан Гордон

4
Також існує зміщення експонентів, так що ви можете представляти набагато більше дискретних значень між 0 і 1, ніж ви можете від 1 000 000 до 1 000 001. І виникають багато ускладнень з операціями з плаваючою комою, які, як-от, гарантують, що ви не повідомляєте 0 як різницю між двома дуже схожими числами, коли зміщення недостатньо для збільшення точності.
Брайан Гордон

28
@BrianGordon: Я не забув знакові біти; Я навмисно їх ігнорував, щоб мати простий опис і не турбуватися про різницю між мінімумом / максимальним і найменшим / найбільшим. Я також навмисно відкинув зміщення експонентів (що не має нічого спільного з кількістю дискретних значень між будь-якими двома числами), NaNs, нескінченності, нормалізація, поступовий підтік, підписані нулі, факт, що більшість плавців є бінарними (що дозволяє перший біт мантіси, яку не можна залишити), і ряд інших аспектів, які не потрібні для ілюстрації концепції.
Гейб

2
Чому дорівнює мінімальна кількість фіксованої точки 00000.00001? Я очікую побачити 00000.00000замість цього. Крім того, чи є у вас посилання, які детальніше розглядають цифри з фіксованою точкою?
Ніколас Міллер

4
@NickMiller: Вибачте за плутанину, але я говорив про ненульові числа. Мій приклад формат може представляти 0, 0,00001, 0,00002, ..., 99999,99998, 99999,99999.
Гейб

31

Фіксований номер точки просто означає, що після десяткової крапки існує фіксована кількість цифр. Число з плаваючою комою дозволяє змінювати кількість цифр після десяткової крапки.

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

Часто, коли використовується фіксована точка, програміст фактично використовує ціле число, а потім робить припущення, що частина цифр перевищує десяткову точку. Наприклад, я можу захотіти зберегти дві цифри точності, тому значення 100 означає, що насправді означає 1,00, 101 означає 1,01, 12345 означає 123,45 і т.д.

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


2
Використання плаваючої крапки стає проблемою, коли ви починаєте робити з ними обчислення, як, наприклад, якщо ви додаєте разом дійсно невелике і дійсно велике число з плаваючою комою. Підсумований результат втрачає точність, оскільки він повинен представляти число з двома крайнощами, а нижні десяткові знаки відсікаються (і не округляються).
Ендрю Норман

2
також потенційне використання значень експонентів у плаваючій точці може спричинити проблеми з комп'ютерними системами, які очікують стандартних чисел
Ендрю Норман

5

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

Наприклад, якщо число 12.34потрібно зберігати і нам потрібні лише дві цифри точності після десяткової крапки, число перемножується 100на отримання 1234. Виконуючи математику за цим числом, ми використовували б цей набір правил. Додавання 5620або 56.20до цього числа дасть 6854в даному або 68.54.

Якщо ми хочемо обчислити десяткову частину числа з фіксованою точкою, використовуємо операнд модуля (%).

12.34 (псевдокод):

v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

Числа з плаваючою комою - зовсім інша історія в програмуванні. Поточний стандарт для чисел з плаваючою комою використовує щось на зразок 23 біт для даних числа, 8 біт для експонента та 1, але для знака. Перегляньте посилання Вікіпедії для отримання додаткової інформації про це.


3

Термін "фіксована точка" означає відповідний спосіб представлення чисел із фіксованою кількістю цифр після, а іноді і раніше десяткових знаків. У поданні з плаваючою комою розміщення десяткової крапки може «плавати» щодо значущих цифр числа. Наприклад, подання з фіксованою точкою з рівномірною умовою розміщення десяткової крапки може представляти числа 123.45, 1234.56, 12345.67 тощо, тоді як подання з плаваючою комою може додатково представляти 1,2234567, 123456,7, 0,00001234567, 1234567000000000 тощо.


-6

Візьміть число 123.456789

  • Як ціле число, це число буде 123
  • Як фіксована точка (2), це число складе 123,46 (якщо припустити, що ви її округлили)
  • Як плаваюча точка, це число складе 123,456789

Плаваюча точка дозволяє з великою точністю представляти більшість кожного числа. Виправлено менш точно, але простіше для комп'ютера.


11
Точність, з якою можна записати число, не пов’язана з тим, чи написано це з плаваючою точкою, цілим чи фіксованою точкою. Це пов’язано з кількістю наявних у вас значних цифр. Наприклад, INT_MAX - це число, яке може бути точно представлено як int, але не як float, оскільки у них немає 31 біта точності, необхідного для його точного відображення.
Кіан

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

Це вводить в оману і неправильно. Фіксована точка означає, що кількість цифр після десяткової точки фіксована. Це нічого не говорить про те, яка точність має.
Оскар Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.