将1添加到非常小的数字

时间:2012-11-14 20:32:40

标签: matlab floating-point numbers addition

我有一个关于将数字1添加到非常小的数字的问题。现在,我试图在以实数1为中心的复平面上绘制圆弧。我的代码如下:

arc = 1 + rho .* exp(1i.*theta);

rho是一个非常小的数字,theta从0到pi运行,所以每当1添加到arc的实部时,MATLAB似乎只是围绕它到1,所以当我输入plot(real(arc),imag(arc))时,我看到的只是一个尖峰而不是一个半圆1.有人知道如何解决这个问题,以便MATLAB不会将1 + real(arc)舍入为1,并且而是保存精度?

由于

3 个答案:

答案 0 :(得分:3)

rho=1e-6; theta=0:pi/100:pi; arc=1+rho*exp(1i.*theta); plot(arc); figure(); plot(arc-1);

显示问题出在情节中,而不是精度损失。在rho<1e-13之后,预计将出现精确问题。

另外两种可能的误解:
  - 双打精度有限。 16位十进制数字或1 + 2 ^ -52是双倍数限制   - 格式短格式与长格式格式 - 默认情况下,matlab仅显示6或7位数字

也恰好是6-7位数是32位浮点数的限制,这也可以解释为什么Octave 3.4.3中的绘图函数也可以用浮点数实现。

左:1 + 1e-6 * exp,右:(1 + 1e-6 * exp)-1

答案 1 :(得分:2)

这个探测器有一个内置的解决方案:

exp1m()

log1p()

明确地:

log(arc)=log1p(rho*exp(1i*theta))

得到你需要的东西。

当然,您需要在日志空间中工作以表示此精度,但这是完成此操作的典型方法。

答案 2 :(得分:1)

double precision floating point表示中,可以表示的严格大于1的最小数字是1 + 2^-52

这是在大多数机器上表示非整数数字的方式所施加的限制,可以在软件中避免,但不容易。 See this question about approaches for MATLAB.