Объяснение точности с плавающей запятой для клиентов [закрыто]

23

Как лучше всего объяснить клиентам проблему округления с плавающей запятой ?

Я знаю

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

а также записи в C ++ FAQ и различных других страницах, предназначенные для разработчиков и ученых, но есть ли веб-страница, статья или объяснение, предназначенные для «постоянных» клиентов с ограниченными математическими или научными знаниями? (для которого вышеупомянутые ссылки не имеют успеха).

Если бы оно поддерживалось или поступало от хорошо известного и признанного учреждения или корпорации, тем лучше, учитывая, что, как некоторые из вас, возможно, испытали, это может быть немного сложным, чтобы объяснить это самостоятельно.

Эрик Грандж
источник
1
Я бы не стал беспокоиться ...
Джон Шафт
1
Это действительно фантастический вопрос, +10, если можно. Частая проблема для разработчиков.
Коди Грей
2
Это не проблема детализации, она отвечает на вопрос, почему, добавляя то, что смотрит на числа с точностью до 2 десятичных цифр, вы получаете 5,99999999, а не 6, и почему вы должны указать точность округления, когда это «очевидно», результат не должен не может иметь более двух десятичных цифр. Или почему иногда 2 минус 2 не всегда ноль, и при этом не выглядят как дурак.
Эрик Грандж,
9
@Eric Grange: если ваши клиенты считают эти вопросы точности , как ошибка, то, что это ошибка , и вы должны найти способ , чтобы исправить это (возможно, не используя поплавок). Их не волнует, откуда возникает эта проблема точности. Их не волнует, как работает ваше программное обеспечение. Они просто хотят, чтобы это сработало.
Дэвид
3
@Eric: использование плавающей запятой - это деталь реализации. Я повторяю свой вопрос, который просит ничего не объясненного в этом вопросе, и который я, очевидно, не разъяснил (извинения): каков контекст и почему вы обсуждаете использование плавающей запятой с клиентом?
Том Андерсон

Ответы:

8

Я нахожу простой способ объяснить это, чтобы продемонстрировать это. Обсудите, как деление xна число, а затем умножение на одно и то же число должно вернуть вас xснова - заставить клиента согласиться с тем, что это всегда должно иметь место. Тогда сделайте старое (100 / 3) * 3на калькуляторе; покажите, что значение, как и следовало ожидать, не возвращается к 100. Когда большинство людей видят простую математику, «ломающуюся», то склонны «понимать» опасность чисел с плавающей запятой, где важна точность (хотя в интуитивном кстати, а не на низком уровне, на который вы указываете статья).

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

Скотт
источник
1
Да, почти все калькуляторы хранят как минимум 2 дополнительные цифры, поэтому вам нужно добавить несколько множителей в микс, что запутывает объяснение, и IME заставляет их думать, что вы пытаетесь обмануть их. Квадратный корень требует меньше операций, но квадратный корень уже находится за пределами повседневной жизни постоянных клиентов.
Эрик Грэйндж
2
@ Скотт Я попробовал несколько калькуляторов здесь, ни у одного из них не было проблем с (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 значащие цифры могут быть приемлемы, но затем рассмотрим, что происходит, когда накапливаются подобные ошибки округления. Вот где настоящая опасность.

Joonas Pulakka
источник
2
Я лично знаю и понимаю, но для некоторых людей «плавающая точка» - это уже чужой термин, поэтому вам нужно больше, чем математическое или научное объяснение, чтобы объяснить, что то, что они могут вычислить прямо в голове, их дорогие компьютеры и программное обеспечение имеют проблемы с получением правильного значения ;) Также квадратный корень находится за пределами повседневной жизни постоянных клиентов.
Эрик Грэйндж
5

Сначала определите, на что они жалуются. Финансовые операции должны выполняться точно, с правильным количеством десятичных знаков и правильными правилами округления. Обычно это означает поддержание целых чисел в денежных единицах и проверку правильности арифметики.

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

Для чисел в целом вы всегда можете попытаться придумать трехзначное десятичное число x, такое что x * 3 равно 10. Это показывает основные принципы.

Есть две оставшиеся проблемы. Во-первых, некоторые числа могут быть выражены точно в десятичном виде, но не в двоичном (скажем, 3.15). Это будет трудно объяснить нетехническим людям, и лучше всего стараться избегать этого, не предоставляя достаточно значащих цифр, чтобы оно появилось. Другой - клиент, который знает немного, достаточно, чтобы знать, что компьютерная арифметика не всегда точна и недостаточно, чтобы понять, что десятичная арифметика не всегда точна. Я поспорил с некоторыми из них, и мне нечего сообщить.

Дэвид Торнли
источник
3

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

Теперь попробуйте хранить 10 центов как комбинацию половин, кварталов и восьмых доллара. Это просто не работает:

.00011001100110011. , , ( повторяется бесконечно )

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

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

Скотт Уитлок
источник
1

Скажите им, что точно так же, как на их банковском счете не может храниться 4,4423425908459032890413 ... долларов (это либо 4,44 доллара, либо 4,45 доллара, между ними ничего нет), компьютер не может легко сохранить число с произвольной точностью. Недостатки памяти приводят к несовершенствам вычислений.

(Это немного обманывает, но должно дать им представление о том, в чем проблема.)

quant_dev
источник
2
Увы, это объяснение не работает, так как проблема точности может возникнуть при суммировании чисел, для которых у всех есть только две цифры точности для начала.
Эрик Грандж
1
Две десятичные цифры. Да, я согласен, любознательный клиент обнаружит в нем дыры. Но тогда вы можете поразить их обсуждением бинарного представления - они просили об этом ;-)
quant_dev
Что ж, уже пытаясь объяснить число с плавающей точкой, IME немедленно начинает думать, что вы пытаетесь сбить их с толку, что можно было бы облегчить, если бы оно исходило простыми, понятными терминами или из хорошо известного учреждения или корпорации. :)
Эрик Грандж
1
@Eric Math трудно, давайте идти играть в бейсбол: P
quant_dev
1
Спросите, является ли более точным измерение чего-либо с точностью до 1/10 "или ближайшего миллиметра. Последний более точный, но объекты, которые имеют точное кратное 0,1", не будут точным кратным 1 мм, если они не являются также с точностью до 5 "(точно 127 мм). При добавлении размера двух объектов 2,54 мм, которые измерены с точностью до 0,1", получится общий размер 0,2 "; при сложении размеров, округленных до ближайшего миллиметра, будет получено 6 мм, даже если фактический размер должен быть 5,08 мм.
суперкат
1

2/3

Попросите их записать точный ответ на два, разделенных на 3.
Поскольку ответ «длится вечно», вы можете указать на это.

Использование 1/3 также подойдет, но 2/3, возможно, немного лучший пример, поскольку округление дает вам (например) .6666667, тогда как .3333333 выглядит так, как будто его можно просто усечь.

Майкл Даррант
источник
0

При выполнении вычислений компьютеры обычно используют приближения к числам (например, вместо 1000000.7 они используют 1000000), потому что использование приближений намного быстрее. Проблема в том, что когда вы делаете вычисления с аппроксимациями, вы получаете аппроксимации обратно. Обычно это работает довольно хорошо, но иногда это приводит к неожиданным результатам.


источник
Я не очень понимаю, что ты здесь говоришь. «Потому что использование приближений намного быстрее»? Иногда целочисленная арифметика, по крайней мере, так же быстро, и это точно. Иногда альтернативы нет (как в распечатке квадратного корня из 2).
Дэвид Торнли
Ну, вы пытаетесь объяснить маркетологу, почему компьютеры не могут на самом деле представлять иррациональные числа, или, в сущности, любое число в общей схеме вещей (о, и тогда вы, возможно, захотите дать ему краткую лекцию о иррациональности \ pi: что-то на Ряд Фурье может быть симпатичным). Приблизительное - это слово, которое люди могут понять. Вы подходите к этому с точки зрения того, кто знает, что все числа не равны.
0

Некоторые расчеты выполняются в соответствии с некоторыми правовыми нормами. Например, если вы хотите рассчитать, какой подоходный налог должен быть уплачен с облагаемого налогом годового дохода в размере 79 245 188 евро в Германии, есть только один правильный ответ. Вы понимаете это правильно или неправильно. Если вы понимаете это правильно, вам не нужно объяснять, как работает арифметика с плавающей запятой. Если вы ошиблись, вам не нужно объяснять, как работает арифметика с плавающей запятой, вы должны исправить неисправный код.

Иногда вы видите результаты, которые выглядят неправильно. Например, если вы конвертируете 13 297,46 долларов США в британские фунты стерлингов с двумя десятичными цифрами, а затем конвертируете эту сумму в британские фунты стерлингов обратно в доллары США, вы можете получить не 13 297,46 долларов США, а 13 297,45 долларов США или 13 297,47 долларов США. Это не имеет ничего общего с арифметикой с плавающей точкой. Это неизбежная проблема, и вам лучше объяснить, почему она неизбежна. (Вы также должны знать, почему проблема не возникает при конвертации из британских фунтов стерлингов в доллары США и обратно).

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

Далее, существуют ситуации, когда неосторожное использование арифметики с плавающей точкой приводит к неуместным результатам. Например, a + b + c обычно не совпадает с b + c + a. Если это вызывает проблему, объяснять нечего, это то, что вы исправляете.

gnasher729
источник