2014-08-28 3 views
0

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

Теперь алгоритм должен быть реализован в программном обеспечении. Разработчик может читать формулы и начать перевод, например. Sum(f(x)) [1..n](кажется, TeX здесь не допускается)for петля.

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

Интересно, кто несет ответственность за точность вывода. Это математик или он разработчик? Математик может не знать достаточно о форматах номеров компьютеров, в то время как разработчик может не знать достаточно о математике для реструктуризации формулы.

Простой пример:

Учитывая Binomial coefficientn over k что переводится n!/(k! (n-k)!).

Простая реализация будет, вероятно, использовать функцию факториала, а затем ввод число непосредственно (псевдо-код):

result = fac(n)/(fac(k) * fac(n-k)) 

Это может привести к переполнению для увеличения п. Зная это, можно разделить n! by k! первый и делать (псевдокод):

result = 1 
for (i = k+1 to n) result *= i 
result = result/fac(n-k) 

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

+0

Взаимодействие между математиками и программистами является ключевым. И обратите внимание, что 13! переполняет 32-битное целое число: не особо большое. – Bathsheba

+1

Ваш пример не имеет ничего общего с точностью. Целые числа точны, числа с плавающей запятой - нет. Существуют проблемы точности, присущие числовым алгоритмам, тогда как проблемы с целым размером всегда могут быть решены путем увеличения целочисленного размера. –

+0

Вот почему, ИМХО, хороший программист * должен * иметь прочную основу в математике. Одно дело - перетаскивать виджеты для создания графического интерфейса или что-то в этом роде, совсем другое дело, чтобы иметь возможность читать исследовательскую статью, например. новый алгоритм сжатия изображений и возможность правильно кодировать что-либо на основе теоретических математических конструкций в рамках ограничений аппаратного обеспечения с конечной точностью. – twalberg

ответ

2

Эта наука называется numerical analysis

http://en.wikipedia.org/wiki/Numerical_analysis

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

1

Короткий ответ: разработчик.

Алгоритм (только формулы) управляет произвольными точными действительными числами как чистые математические объекты.
Код (по формуле) работает с реальным оборудованием и должен преодолевать ограничения (которые зависят от вашего оборудования), используя более сложный код.

Пример: Формула f(x,y) = x * y может привести к очень сложному исходному коду (если x, y являются 64-битными действительными числами с плавающей запятой, а ваше оборудование - 8-разрядный микроконтроллер без поддержки FPU и без целочисленной инструкции MUL).

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