2010-04-28 5 views
5

Есть ли какие-либо примеры компаний, которые были сожжены данными с плавающей запятой, что вызвало проблему округления? Мы внедряем новую систему, и все денежные значения хранятся в поплавках. Я думаю, что если я смогу показать фактические примеры того, почему это провалилось, у него будет больше веса, чем теория того, почему значения не могут быть сохранены должным образом.Пример реальной жизни для ошибки с плавающей точкой

ответ

3

Эти examples являются из встроенного мира (Ariane 5, Patriot), но не являются ошибками округления с плавающей запятой stricto sensu. Ошибка Ariane 5 - ошибка в преобразовании. Ошибка Patriot была введена во время адаптации программного обеспечения. Он включает вычисления в разных точках с неотъемлемой непредставимой константой (которая оказывается безобидной - 0.10).

Есть две проблемы, я предвижу с бинарными поплавками для денежных значений:

  • значения десятичного как общие, как 0.10 не могут быть представлены точно.

  • Если точность слишком мала, то, что могло быть чистым переполнением, исключение становится труднодоступной для потери точности.

Обратите внимание, что форматы с плавающей точкой базы-10 были стандартизованы именно для денежных значений: некоторые валюты стоят 1/1000000 из доллара, никогда не обменивались менее чем тысячи, а максимальная сумма, которую вы можете чтобы иметь возможность представлять пропорционально большую, поэтому масштабируемое представление имеет смысл. Цель состоит в том, что мантисса достаточно велика для крупнейших сумм с официальным разрешением.

+0

Приятно, хотя второе показывает, почему плавать было бы хорошей вещью - если бы она была непротиворечивой. –

+0

@ Майкл. Да, извините, я хотел расширить это, но меня отозвали. –

+0

святое дерьмо ... Я думал, что это обозначил как ответ. Извини за это. Только через полтора года ... – Rob

0

Я работал над системой, которая рассчитывала заработную плату людей и бонусы. Расчеты были относительно сложными из-за количество деталей (производительность компании, производительность отдела, личная производительность), но каждая часть была достаточно проста (как правило, усугубляются проценты) что-то вроде:

personal_bonus = зарплата * personal_bonus_percentage

department_bonus = personal_bonus * 50%

company_bonus = personal_bonus * 110%

total_bonus = personal_bonus + department_bonus + company_bonus

Где personal_bonus_percentage - расчетное значение, основанное на размере бонусного банка, рейтинга человека и людей с этим рейтингом.

Когда мы протестировали, мы не вычислили вручную (то есть на бумаге), какими должны были быть результаты, вместо сравнения с Excel, использующими ту же формулу. Сотрудники делали расчеты на бумаге, и когда мы переписывали алгоритм для противодействия проблеме с плавающей точкой, около 5% вознаграждений были ошибочными.

0

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

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

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

0

Единственная реальная ошибка FPU, о которой я могу думать, - это сравнение равенства по поплавкам. Например, 0.123456 и 0.123457 очень близки; на самом деле, они вполне могут быть равны, если они являются результатом серии вычислений, в которых могут скапливаться ошибки округления. Вместо сравнения с ==, вы должны авторизовать нечеткое равное, которое определяет, достаточно ли они близки, чтобы считаться равными.

Быстрый поиск по Google поднимает эту страницу, что в значительной степени связано с связанными предостережениями относительно функции нечетких равных. http://adtmag.com/articles/2000/03/16/comparing-floats-how-to-determine-if-floating-quantities-are-close-enough-once-a-tolerance-has-been.aspx

1

Я работал над командой, которая создала FPU (аппаратный дизайн), который прошел testfloat level 3 для одиночной, двойной и расширенной точности. Там много плохих fpus, в основном исправленных в программном обеспечении, если они могут поймать инструкцию или исключение, такую ​​вещь. Я думаю, что парень из testfloat сказал, что первичные ошибки fpu находятся в int, чтобы плавать и плавать до конверсий int, я помню, что pentium 4 не удалось по этой причине. Тем не менее, пентиум III я прошел тест. Я не пробовал это через некоторое время, не знаю, что такое состояние этих многоядерных процессоров. Не обманывайтесь, думая, что в пентиуме я был единственным с ошибками, почти у всех, конечно же, с более крупными именованными компаниями, с ошибками fpu. IEEE 754 является ужасным стандартом, получение fpu для удовлетворения этого стандарта очень сложно и очень дорого, после этого опыта я избегаю математики с плавающей запятой как можно больше. компиляторы и библиотеки c (atof, ftoa, strtod, printf и т. д.) являются частью проблемы, а не только аппаратного обеспечения.

Одиночный поплавок имеет только 23 бит мантиссы, вы собираетесь часто бросать пенни или доллары или тысячи долларов. С округлением или без него. Округление должно составлять среднее значение, если данные достаточно случайны, чтобы получить пенни, здесь теряется пенни. Если отслеживаемые объекты всегда имеют фиксированный размер или ограниченное количество единиц. например, виджеты на 9.99 или два на 15.99, тогда случайность уходит и округляется, а мантисса будет стоить кому-то по точности, будь то компания или клиенты.

Уверены, что, вероятно, есть много чисел между 0.00 и 0.99, которые вы не можете представлять, если вы имеете дело с небольшими количествами, вы скорее окажетесь в округлении, чем позже.

Использование плавающих денег - это просто плохая идея, возможно, вы ищете боеприпасы, чтобы изменить это?

У нас был мотор-контроллер, который управлялся программным обеспечением, которое использовало одноточечный fpu, был один раздел алгоритма управления, который константы должны были добавить до 1.0, я не знал этого правила, я просто разрешаю C программа вычисляет константы. Нам нужно было отрегулировать lsbit мантиссы на одной из констант вручную, чтобы заставить контроллер двигателя стабилизироваться.

0
double: 1.000167890 
single: 1.000167847 
(b*(b-1)) - (b*b-b): 0.0000000281725079 
(a*(a-1)) - (a*a-a): 0.0000000000000001 
resultSmall - result: 0.000000028172507807931691 
double^12 - single^12:0.000000593091349143648472 

Я помню, что ошибки - или эксцентриситеты - используемые существовать в суперкомпьютерах, разработанного Seymour Cray. Его множители будут проверять только первые двенадцать бит за ноль, в то время как сумматор искал 13, оставляя за собой крошечный процент чисел, который может быть от нуля до одного, но имеет действительное число для другого.

Один из учеников Уильяма Кахана выполнял симуляцию воздушной турбулентности для роторов вертолетов с использованием 360 IBM, когда он впервые вышел с необычным 32-битным форматом fp.a - b не был точно рассчитан, даже если оба числа были в два раза друг от друга, что привело к возрастающей проблеме потери точности при каждом вычислении. Следовательно, компьютер выдавал неправильные результаты.

У Kahan был его ученик, переписывающий свой код с использованием парных очков, в результате чего были получены правильные точки останова.

Смежные вопросы