我有一个关于将数字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,并且而是保存精度?
由于
答案 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)
这个探测器有一个内置的解决方案:
明确地:
log(arc)=log1p(rho*exp(1i*theta))
得到你需要的东西。
当然,您需要在日志空间中工作以表示此精度,但这是完成此操作的典型方法。
答案 2 :(得分:1)
在double precision floating point表示中,可以表示的严格大于1
的最小数字是1 + 2^-52
。
这是在大多数机器上表示非整数数字的方式所施加的限制,可以在软件中避免,但不容易。 See this question about approaches for MATLAB.