Как лучше всего объяснить клиентам проблему округления с плавающей запятой ?
Я знаю
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
а также записи в C ++ FAQ и различных других страницах, предназначенные для разработчиков и ученых, но есть ли веб-страница, статья или объяснение, предназначенные для «постоянных» клиентов с ограниченными математическими или научными знаниями? (для которого вышеупомянутые ссылки не имеют успеха).
Если бы оно поддерживалось или поступало от хорошо известного и признанного учреждения или корпорации, тем лучше, учитывая, что, как некоторые из вас, возможно, испытали, это может быть немного сложным, чтобы объяснить это самостоятельно.
customer-relations
Эрик Грандж
источник
источник
Ответы:
Я нахожу простой способ объяснить это, чтобы продемонстрировать это. Обсудите, как деление
x
на число, а затем умножение на одно и то же число должно вернуть васx
снова - заставить клиента согласиться с тем, что это всегда должно иметь место. Тогда сделайте старое(100 / 3) * 3
на калькуляторе; покажите, что значение, как и следовало ожидать, не возвращается к 100. Когда большинство людей видят простую математику, «ломающуюся», то склонны «понимать» опасность чисел с плавающей запятой, где важна точность (хотя в интуитивном кстати, а не на низком уровне, на который вы указываете статья).К сожалению, большинство полуприличных калькуляторов (конечно, все научные, которые я видел, и более чем несколько базовых) в настоящее время способны справиться с этим - я предполагаю, что они хранят дополнительные цифры помимо того, что может быть отображено и округлено - так делают проверьте, насколько умен ваш калькулятор, прежде чем делать это перед вашим клиентом.
источник
Я не думаю, что есть ярлыки. Вы должны либо:
Или, если это слишком много, нужно просто:
Может быть , пример с иррациональными числами помогает (даже несмотря на проблемы с плавающей запятой применима к рациональным числам а):
sqrt(2) ~ 1.414
. Тогда1.414^2 = 1.999396
. Независимо от того, сколько цифр вы берете, вы никогда не вернетесь к оригиналу2
. Хорошо, правильные 4 значащие цифры могут быть приемлемы, но затем рассмотрим, что происходит, когда накапливаются подобные ошибки округления. Вот где настоящая опасность.источник
Сначала определите, на что они жалуются. Финансовые операции должны выполняться точно, с правильным количеством десятичных знаков и правильными правилами округления. Обычно это означает поддержание целых чисел в денежных единицах и проверку правильности арифметики.
В качестве альтернативы, они могут жаловаться на чрезмерно точные показы, и сокращение числа значащих цифр может быть всем, что необходимо.
Для чисел в целом вы всегда можете попытаться придумать трехзначное десятичное число x, такое что x * 3 равно 10. Это показывает основные принципы.
Есть две оставшиеся проблемы. Во-первых, некоторые числа могут быть выражены точно в десятичном виде, но не в двоичном (скажем, 3.15). Это будет трудно объяснить нетехническим людям, и лучше всего стараться избегать этого, не предоставляя достаточно значащих цифр, чтобы оно появилось. Другой - клиент, который знает немного, достаточно, чтобы знать, что компьютерная арифметика не всегда точна и недостаточно, чтобы понять, что десятичная арифметика не всегда точна. Я поспорил с некоторыми из них, и мне нечего сообщить.
источник
Числа с плавающей запятой в компьютерах используют двоичные числа, так же как у нас есть система счисления с столбцами единиц, десятков, сотен и десятых, сотых, числа с плавающей запятой в компьютерах на самом деле имеют единицы, двойки, четверки и половинки, четверти и восьмые столбцы. Если клиент знаком с футами / дюймами, напомните ему о том, как вы обычно используете для измерения базовые доли дюйма.
Теперь попробуйте хранить 10 центов как комбинацию половин, кварталов и восьмых доллара. Это просто не работает:
.00011001100110011. , , ( повторяется бесконечно )
Это то же самое, что взять стандартную имперскую измерительную ленту и попробовать измерить одну десятую дюйма. Вы не можете сделать это точно. Нет представления 1/10 в виде X / Y, где X и Y - целые числа, а Y - степень 2.
Вот почему у нас есть десятичные типы данных, которые используют 4 бита для хранения каждой десятичной цифры, поэтому мы вернулись к основному представлению 10. Компромисс заключается в пространстве и производительности (примерно 100% -ое снижение производительности, из того, что я читал).
источник
Скажите им, что точно так же, как на их банковском счете не может храниться 4,4423425908459032890413 ... долларов (это либо 4,44 доллара, либо 4,45 доллара, между ними ничего нет), компьютер не может легко сохранить число с произвольной точностью. Недостатки памяти приводят к несовершенствам вычислений.
(Это немного обманывает, но должно дать им представление о том, в чем проблема.)
источник
2/3
Попросите их записать точный ответ на два, разделенных на 3.
Поскольку ответ «длится вечно», вы можете указать на это.
Использование 1/3 также подойдет, но 2/3, возможно, немного лучший пример, поскольку округление дает вам (например) .6666667, тогда как .3333333 выглядит так, как будто его можно просто усечь.
источник
источник
Некоторые расчеты выполняются в соответствии с некоторыми правовыми нормами. Например, если вы хотите рассчитать, какой подоходный налог должен быть уплачен с облагаемого налогом годового дохода в размере 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. Если это вызывает проблему, объяснять нечего, это то, что вы исправляете.
источник