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


9

Мені сказали, що більшість сучасних комп'ютерів дотримуються того самого стандарту з плаваючою комою, чи це означає, що всі вони отримають однаковий плаваючий відповідь для заданої математичної операції, якщо входи однакові?

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

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

Я читав, що в старих іграх RTS використовуються арифметичні з фіксованою точкою, але я не знаю, чи все-таки це потрібно на сучасних комп’ютерах, якщо всі вони дотримуються одного і того ж стандарту? Мені також сказали, що хоча і неточний, результат з плаваючою комою є детермінованим для того ж вводу (що я вважаю, означає, що будь-який комп'ютер, що слідує за тим же стандартом, отримує той же неточний результат?).

Чи все ж комп’ютери мають відхилення, навіть якщо вони відповідають тому ж стандарту з плаваючою точкою?

Я пишу цю гру на C # не впевнений, чи це має значення, я думав, що все одно це згадаю.


Навіть якби вони це зробили, я б не використовував плавці для цього
Теластин

Що ви маєте на увазі ? Чому ні?
WDUK

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

Відповіді:


18

Чи все ж комп’ютери мають відхилення, навіть якщо вони відповідають тому ж стандарту з плаваючою точкою?

На жаль, так, особливо коли ви використовуєте C # (або іншу мову, складену JIT). Проблема, яка виникає тут, полягає в тому, що етап компіляції JIT в деяких архітектурах процесорів створює код, який використовує більше регістрів процесора, ніж для інших архітектур. Це може призвести до ситуацій, коли на деяких машинах для певних операцій використовується розширена точність з плаваючою точкою , а на інших машинах - ні. Це означає, що для кожного ітеративного обчислення з використанням парних пар є шанс створити різні накопичені помилки округлення.

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


Це. Деякі першопричини: IEEE Std 754 включає необов'язкові пункти "слід" (наприклад, обробка NaN) та дозволяє проектувати альтернативи (наприклад, виявлення під потоком). Якщо мовні прив'язки підтримують стандарт з плаваючою комою, вони все ж можуть надавати свободу компілятору під час оцінки виразів з плаваючою комою, наприклад, FLT_EVAL_METHODв ISO C / C ++. Трансцендентні функції (наприклад sin, exp, log) в значній мірі нерегульованих обидва стандарти з плаваючою точкою IEEE і програмуванням стандартів мови. Просте оновлення версії бібліотеки (наприклад, нова glibcверсія) може спричинити різні результати.
njuffa

Я сам потрапив у гру. Ракета чудово літала на моєму ноутбуці, не летіла б на моєму робочому столі, абсолютно однакових установок.
Лорен Печтел

3

Помилки з плаваючою комою

Кожне число з плаваючою комою накопичує неточність, оскільки використовується для обчислення. Це простий факт використання неточного формату для обчислення. Розрахунки також чутливі до порядку обчислення, комутативність не гарантується, тобто: (a + b) + cможе бути, а може і не збігатися a + (b + c).

Крім того, процесори не обов'язково мають таку ж довжину мантіси, що і стандарт пам'яті. Це може породжувати цікаву поведінку, оскільки 32/64/128 бітний плаватель час від часу працює так, ніби у них більше бітів.

Помилки з фіксованою точкою

При цьому арифметика фіксованої точки також може накопичувати помилки. Різниця полягає в тому, що цифри фіксованої точки чітко визначають, яка точність втрачається, і залежно від обраних операцій можна взагалі уникнути помилок округлення. Вони також є комутативними (a + b) + c = a + (b + c).

Котрий?

Який використовувати, повністю залежить від того, які властивості вам потрібні.

Номери з плаваючою комою:

  • дають величезний діапазон значень, які стають дуже дрібнозернистими впритул і поступово віддаляються в крайностях.
  • чутливі до порядку розрахунку
  • накопичувати помилки округлення з часом.
  • може мати нестабільну поведінку через невідповідність розміру плаваючого апарату / пам'яті.

Номери з фіксованою точкою:

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

1
"цифри з фіксованою точкою зрозуміли, яка точність втрачена" - плаваючі точки також зрозумілі, різниця є досить неточними фіксованими точками, більш інтуїтивними щодо звичайної нумерації життя
whatsisname

1
Тож лише фіксована точка гарантує, що всі комп'ютери, незалежно від обладнання та ін., Зазнають однакових помилок / втрати точності?
WDUK

1
По суті, так, тому що ви можете вказати, що ваші цифри з фіксованою точкою є 32 або 64 біти, і вони будуть у всіх системах. Числа з плаваючою комою можуть бути 32 або 64-розрядні, але апаратне забезпечення може фактично використовувати 48 або 96 біт для обчислення і перетворення в 32 або 64 біт наприкінці, що призводить до відмінностей між різними типами обладнання.
користувач1118321

@whatsisname Хоча специфікації з плаваючою точкою цілком зрозумілі, ви не можете легко сказати мені , що округлення питань , я буду стикатися в цій сумі: (a + b * c) / d - e. За винятком очевидних питань, таких як NaNподіл на нуль або перелив / перелив, цей вираз може бути неправильним. Додайте до цього імпеданс між пам'яттю та реєстрацією з точки зору точності і навіть просте завантаження / зберігання з пам'яті "того ж" значення плаваючої точки змінить відповідь.
Kain0_0

@ Kain0_0: ти маєш рацію, я не можу з легкістю сказати тобі, з чим зіткнушся, бо я не експерт з плаваючою точкою. Саме це мається на увазі, коли я сказав "більш інтуїтивно зрозумілий до звичайної життєвої нумерації". Коли ви кажете, що фіксована точка є "чистою", а плаваюча точка - ні, ви звучите так, ніби поплавці є, здавалося б, випадково неточними.
whatsisname

-1

Є питання, чому ви хочете гарантувати однакові результати, оскільки однакові результати взагалі не дають гарантії того, що ваші результати корисні .

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

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


Я не спростував вашої відповіді, але, здається, випадок, описаний ОП, є саме "однією з тих небагатьох ситуацій, коли відтворюваність дійсно важлива". У грі RTS невелика помилка округлення може змінити різницю між "двома об'єктами, зіткненими" чи ні.
Док Браун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.