假设一些研究人员已经想出了一种分析数据的方法,并且他们为此开发了一种算法。当时,该算法在书中描述,使用大量的数学公式。谁负责精度?
现在算法需要用软件来实现。开发人员可以阅读公式并开始翻译,例如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)不会溢出受苦。
数学家和程序员之间的协作是关键。并注意13!溢出一个32位整数:不是特别大。 – Bathsheba 2014-08-28 14:22:10
你的例子与精度无关。整数是精确的,浮点数不是。数字算法存在固有的精度问题,而整数大小的问题总是可以通过增加整数大小来解决。 – 2014-08-28 14:43:27
这就是为什么,恕我直言,一个好的程序员*必须*有一个强大的数学基础。拖拽小部件来创建一个GUI或其他东西是一回事,这是一个完全不同的事情,能够阅读关于例如Web的研究论文。一种新的图像压缩算法,并能够在有限精度硬件的约束下,基于理论数学结构正确地编码某些东西。 – twalberg 2014-08-28 15:15:31