让我们说一些研究人员已经找到了一种分析数据的方法,他们已经为此开发了一种算法。当时,使用大量数学公式在书中描述了算法。
现在算法需要用软件实现。开发人员可以阅读公式并开始翻译,例如Sum(f(x)) [1..n]
(此处不允许使用TeX)到for
循环。
根据开发人员如何将公式转换为代码,浮点运算中可能存在溢出或截断。对实际输入值不太了解,单元测试可能无法检测到这些问题。但是,在某些情况下,只需重新排序项目或简化术语即可避免这种情况。
我想知道谁负责输出的精确度。它是数学家还是开发人员?数学家可能对计算机数字格式知之甚少,而开发人员可能对数学没有足够的了解来重构公式。
一个简单的例子:
鉴于Binomial coefficient n 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)
这是a)更快,因为它需要更少的计算,b)不会出现溢出。
答案 0 :(得分:2)
这门科学被称为numerical analysis
http://en.wikipedia.org/wiki/Numerical_analysis
在我的理解中,分析是在数学家方面进行的,但程序员有责任知道存在的问题并寻找正确的众所周知的解决方案(比如不使用简单的Euler积分器而是使用Runge-Kutta)。
答案 1 :(得分:1)
简短回答:开发者。
算法(只是一个公式)将任意精度实数操作为纯数学对象 代码(基于公式)与真实硬件一起使用,必须通过使用更复杂的代码克服限制(取决于您的硬件)。
示例:公式f(x,y) = x * y
可能导致非常复杂的源代码(如果x,y是64位浮点实数,并且您的硬件是没有FPU支持且没有整数MUL指令的8位微控制器)。 / p>