2014-08-28 56 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。知道这一点,人们可以分裂n!由k!第一,做(伪代码):

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

这是一个)更快,因为它需要较少的计算和b)不会溢出受苦。

+0

数学家和程序员之间的协作是关键。并注意13!溢出一个32位整数:不是特别大。 – Bathsheba 2014-08-28 14:22:10

+1

你的例子与精度无关。整数是精确的,浮点数不是。数字算法存在固有的精度问题,而整数大小的问题总是可以通过增加整数大小来解决。 – 2014-08-28 14:43:27

+0

这就是为什么,恕我直言,一个好的程序员*必须*有一个强大的数学基础。拖拽小部件来创建一个GUI或其他东西是一回事,这是一个完全不同的事情,能够阅读关于例如Web的研究论文。一种新的图像压缩算法,并能够在有限精度硬件的约束下,基于理论数学结构正确地编码某些东西。 – twalberg 2014-08-28 15:15:31

回答

2

这门科学被称为numerical analysis

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

在我的理解分析是数学家的一面,但它是程序员的责任,知道问题的存在,并寻找正确的众所周知的解决方案(如不使用简单的欧拉积分器,但龙格库塔)。

1

简答:开发者。

算法(只是一个公式)操作任意精度实数作为纯数学对象。
代码(基于公式)适用于真实的硬件,并且必须通过使用更复杂的代码来克服限制(取决于您的硬件)。例如:公式f(x,y) = x * y可能会导致非常复杂的源代码(如果x,y是64位浮点实数,并且您的硬件是8位微控制器,且不支持FPU且不带整数MUL指令)。