2016-04-19 2 views
0

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

for i in range(10000): 
    nominal_demand = normalized_random(4) 
    stock = random.random() * 10 
    price = sum(nominal_demand)/stock 
    quota = nominal_demand/price 
    assert sum(quota) <= stock, (stock, nominal_demand) 
  1. Как решить эту проблему довольно моды?
  2. Как я могу решить это в утверждении, игнорируя «мало-помалу»?
  3. Как я могу решить это в заявлении assert, когда количество клиентов (4) неизвестно. (Я знаю, что в примере, но в реальном коде производства это не так.
  4. Я также заинтересован в C++ и Cython решения
+0

Последнее состояние клиента обычно получает все, что осталось. – SergeyA

+4

Почему вы отмечаете этот вопрос [tag: C++]? Я не вижу никакой значимости. То, что вас интересует C++-решениями C++, не делает эти теги действительными. Так или иначе, ваш вопрос вне темы как _too wide_. –

+0

Проблема в том же и в C++, меня тоже интересуют решения на C++, см. Edit. –

ответ

1
  1. Если вы хотите использовать с плавающей точкой, я не думаю, есть «прекрасное решение». Всегда будет потенциальная ошибка округления. Ответ Сергея о назначении остатка клиенту звучит неплохо, но не является надежным, так как математика с плавающей запятой не является коммутативной.
  2. Определите и используйте метод для проверки приблизительного Это PEP и this example implementation могут быть полезными.
    assert isclose(sum(quota), stock)
  3. Не уверен, что я понимаю озабоченность здесь, но этот подход должен обобщать на n клиентов. Ошибка будет масштабироваться по величине запаса, но если вы используете относительные допуски, то допуск должен масштабироваться вместе с ним.
  4. Такой же подход применяется к C++.
Смежные вопросы