Пояснення клієнтам точності з плаваючою комою [закрито]


23

Який найкращий спосіб пояснити клієнтам питання округлення плаваючої точки ?

я знаю

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

а також записи у C ++ FAQ та різних інших сторінках, спрямованих на розробників та вчених, але чи є веб-сторінка, стаття чи пояснення, спрямовані на "постійних" клієнтів з обмеженим математичним чи науковим досвідом? (для яких вищезазначені посилання випадають рівними).

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


1
Я б не переймався ...
Джон Шафт

1
Це дійсно фантастичне запитання, +10 якщо я міг. Часта проблема для розробників.
Коді Грей

2
Це не проблема деталізації, це відповідь fi чому додавання того, що дивиться на 2 точні цифри точності, ви отримуєте 5.9999999, а не 6, і чому ви повинні вказати точність округлення, коли "очевидний" результат не повинен " t мають більше двох десяткових цифр. Або чому іноді 2 мінус 2 не завжди дорівнює нулю, і не схожий на бамбукового дурня, роблячи це.
Ерік Грендж

9
@Eric Grange: якщо ваші клієнти вважають ці питання точності , як помилка, то, що це помилка , і ви повинні знайти спосіб , щоб виправити це (можливо, не використовуючи поплавок). Їм не байдуже, звідки береться ця проблема точності. Їм не байдуже, як працює ваше програмне забезпечення. Вони просто хочуть, щоб це спрацювало.
Девід

3
@Eric: Використання плаваючої крапки - це деталь реалізації. Я повторюю своє запитання, яке вимагає не щось пояснене в питанні, і яке я, очевидно, не зрозуміло (вибачення): що таке контекст, і чому ви обговорюєте використання плаваючої точки з клієнтом?
Том Андерсон

Відповіді:


8

Я знаходжу простий спосіб пояснити це - продемонструвати це. Обговоріть, як ділення xна число, а множення на одне число повинно повернути вас xзнову - дозволіть замовнику погодитися, що так має бути завжди. Потім робіть старий (100 / 3) * 3на калькуляторі; покажіть, що значення не, як ви очікували, повертається до 100. Коли більшість людей бачать просту математику, яка "руйнується", тоді, як правило, "отримують" небезпеку числа з плаваючою комою, де важлива точність (хоча в інтуїтивному розумінні швидше, ніж на низький рівень, у який ви вказуєте статтю).

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


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

2
@Scott Я спробував на декількох калькуляторах тут, жоден не виставляв проблем із (100/3) * 3, навіть (100/3) * 3-100 не виставляв проблем .... Excel також це правильно.
Ерік Ґрандж

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

4
Не турбуйтеся з калькулятором. Розділіть 1 на 3 на папері, зберігаючи три значні цифри.
Девід Торнлі

5
@omegacentauri, якщо ви вважаєте, що це пояснення допомагає, я гадаю, ви не спілкуєтесь із клієнтами часто.
ривок

5

Я не думаю, що є ярлики. Ви повинні:

  • Зрозумійте, що таке плаваюча точка і як вона поводиться.

Або, якщо це занадто багато, потрібно просто:

  • Прийміть, що комп'ютер не дасть точних числових результатів.

Може бути , приклад з ірраціональними числами допомагає (навіть незважаючи на проблеми з плаваючою комою може бути застосована до раціональних числах а): sqrt(2) ~ 1.414. Потім 1.414^2 = 1.999396. Незалежно від того, скільки цифр ви візьмете, ви ніколи не повернетесь до оригіналу 2. Добре, 4 значущі цифри правильних можуть бути прийнятними, але потім розглянемо, що відбувається, коли накопичуються подібні "помилки округлення". Ось де справжня небезпека.


2
Я особисто знаю і розумію, але для деяких людей "плаваюча точка" - це вже чужий термін, тому вам потрібно більше, ніж математичне або наукове пояснення, щоб пояснити, що те, що вони можуть обчислити прямо в голові, їх дорогі комп'ютери та програмне забезпечення мають проблеми з отриманням права ;) Також квадратний корінь знаходиться поза повсякденною сферою постійних клієнтів.
Ерік Гренд

5

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

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

Щодо чисел взагалі, ви завжди можете спробувати придумати трицифровий десятковий х такий, що x * 3 дорівнює 10. Це показує основні принципи.

Залишилися дві проблеми. Одне полягає в тому, що певні числа можна виразити точно десятковими, але не двійковими (скажімо, 3.15). Це буде важко пояснити нетехнічним людям, і найкраще постаратися - спробувати уникнути цього, не надавши достатньо значущих цифр для його відображення. Інший - замовник, який знає небагато, достатньо, щоб знати, що комп'ютерна арифметика не завжди точна і недостатня, щоб усвідомити, що десяткова арифметика не завжди точна. Я посперечався з кількома з них, і не маю нічого корисного для звітності.


3

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

Тепер спробуйте зберігати 10 центів у поєднанні половинок, четвертин, восьмих доларів. Це просто не працює:

.00011001100110011. . . ( повторюється нескінченно )

Це те саме, що взяти стандартну імперську вимірювальну стрічку і спробувати виміряти одну десяту дюйма. Ви не можете зробити це точно. Немає представлення 1/10 як X / Y, де X і Y - цілі числа, а Y - сила 2.

Тому ми маємо десяткові типи даних, які використовують 4 біти для зберігання кожної десяткової цифри, тому ми повернулися до базового подання 10. Компроміс - у просторі та продуктивності (приблизно 100% хіт продуктивності, з того, що я читав).


1

Скажіть їм, що так само, як їхній банківський рахунок не може вмістити 4.4423425908459032890413 ... доларів (це або 4,44 долара, або 4,45 долара, нічого між ними), комп'ютер не може легко зберігати номер з довільною точністю. Недосконалість зберігання призводить до недосконалості обчислень.

(Це трохи обман, але має дати їм уявлення про те, у чому проблема.)


2
На жаль, це пояснення не працює, оскільки проблема точності може статися при підведенні підсумків чисел, які для початку мають лише дві цифри точності.
Ерік Ґрандж

1
Дві десяткові цифри. Так, я згоден, допитливий замовник помітить у ньому дірки. Але тоді ви можете вразити їх обговоренням бінарного представлення - вони просили цього ;-)
quant_dev

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

1
@Eric Math важко, давайте
пограємо в

1
Запитайте, чи точніше щось виміряти до найближчого 1/10 "або до найближчого міліметра. Останній є більш точним, але об'єкти, точні кратні 0,1", не будуть точним кратним 1 мм, якщо вони також не є точне кратне 5 "(точно 127 мм). Якщо додати розмір двох об'єктів 2,54 мм, які вимірюються до 0,1", вийде комбінований розмір 0,2 "; додавання разом розмірів, округлених до найближчого міліметра, дасть 6 мм, навіть якщо фактичний розмір повинен бути 5,08 мм.
supercat

1

2/3

Попросіть їх записати точну відповідь на два, поділених на 3.
Оскільки відповідь "продовжується назавжди", ви можете вказати на це.

Використання 1/3 також би спрацювало, але 2/3 - це, мабуть, трохи кращий приклад, оскільки округлення дає (наприклад) .6666667, тоді як .3333333 виглядає так, що його можна просто обрізати.


0

При виконанні обчислень комп'ютери зазвичай використовують наближення до чисел (як-от замість 1000000.7 вони використовують 1000000), оскільки використання наближень набагато швидше. Проблема в тому, що коли ви робите розрахунки з наближеннями, ви отримуєте наближення назад. Зазвичай це працює досить добре, але іноді це призводить до несподіваних результатів.


Я не дуже розумію, що ви тут говорите. "Тому що використання наближень набагато швидше"? Іноді ціла арифметика є принаймні такою швидкою, і це точно. Іноді немає альтернативи (як при роздрукуванні квадратного кореня з 2).
Девід Торнлі

Добре, ви намагаєтесь пояснити маркетинговому хлопцеві, чому комп'ютери насправді не можуть представляти ірраціональні числа або взагалі будь-яке число в грандіозній схемі речей (о, і тоді ви можете хотіти прочитати йому швидку лекцію про ірраціональність \ pi: щось на Серія Фур'є може бути милою). Орієнтовне - це слово, яке люди можуть зрозуміти. Ви підходите до цього з точки зору того, хто знає, що всі числа не рівні.

0

Деякі розрахунки проводяться за деяким законодавчим правилом. Наприклад, якщо ви хочете підрахувати, скільки податку на прибуток потрібно сплатити за оподатковуваний річний дохід у Німеччині 79,245,18 євро, є лише одна правильна відповідь. Ви розумієте це правильно або неправильно. Якщо ви це зрозуміли, вам не потрібно пояснювати, як працює арифметика з плаваючою комою. Якщо ви помиляєтесь, вам не потрібно пояснювати, як працює арифметика з плаваючою комою, ви повинні виправити зламаний код.

Іноді ви показуєте результати, які не виглядають правильно. Наприклад, якщо ви конвертуєте 13 297,46 дол. США у Великобританію £ з двома десятковими цифрами, а потім конвертуєте цю суму £ Великобританії назад в долар США, ви можете отримати не 13 297,46 дол. США, а 13,297,45 або 13,297,47 дол. Це не має нічого спільного з арифметикою з плаваючою комою. Це неминуча проблема, і ви краще зможете пояснити, чому це неминуче. (Ви також повинні знати, чому ця проблема не виникає при конвертації з Великобританії £ в долар США і назад).

Є й інші можливі результати, які не виглядають правильно. Якщо перетворити числа у відсотки, відсотки повинні скласти до 100%, але вони можуть не зробити. Якщо відображати чотири відсотки з двома децималями, чотири відображених відсотка можуть скласти до 99,99% або 100,01%. Нічого спільного з арифметикою з плаваючою комою. Тим не менш, ти повинен мати можливість пояснити, чому.

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

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