Реальный пример fo ошибка С плавающей точкой

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

6
задан Rob 28 April 2010 в 20:21
поделиться

5 ответов

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

Я предвижу две проблемы с двоичными числами с плавающей запятой для денежных значений:

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

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

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

3
ответ дан 17 December 2019 в 07:01
поделиться

Единственная реальная ошибка 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

0
ответ дан 17 December 2019 в 07:01
поделиться

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

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

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

0
ответ дан 17 December 2019 в 07:01
поделиться

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

float одинарной точности имеет только 23 бита мантиссы, вы будете часто выбрасывать гроши, доллары или тысячи долларов. С округлением или без него. Округление должно быть средним, если данные достаточно случайны: выигрыш здесь копейки теряется там. Если отслеживаемые элементы всегда имеют фиксированный размер или ограниченное количество единиц. скажем, виджеты на 9,99 или два на 15,99, тогда случайность исчезает, и округление, как и мантисса, будет стоить кому-то точности, будь то компания или клиенты.

Конечно, существует множество чисел от 0,00 до 0.99, которое вы не можете представить, если вы имеете дело с небольшими количествами, вы будете округлены раньше, чем позже.

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

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

1
ответ дан 17 December 2019 в 07:01
поделиться

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

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
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: