1

我有一个关于将数字 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,而是保持精度?

谢谢

4

3 回答 3

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

于 2012-11-14T20:56:05.657 回答
2

对于这个问题,有一个内置的解决方案:

exp1m()

log1p()

明确:

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

得到你需要的东西。

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

于 2012-11-14T20:56:21.287 回答
1

双精度浮点表示中,严格大于1可以表示的最小数是1 + 2^-52.

这是在大多数机器上表示非整数的方式所施加的限制,可以在软件中避免,但不容易。请参阅有关 MATLAB 方法的这个问题。

于 2012-11-14T20:45:47.323 回答