Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 零附近两个数学上相同的表达式的精度误差_Matlab_Precision - Fatal编程技术网

Matlab 零附近两个数学上相同的表达式的精度误差

Matlab 零附近两个数学上相同的表达式的精度误差,matlab,precision,Matlab,Precision,当绘制两个非常接近于零的数学等价表达式时,我们会得到两个类似的结果,但其中一条曲线有台阶,而不是平滑的 1-cosh(x) == -2*sinh(x/2)^2 现在,快速观察表明,台阶的高度确实等于Matlab的精度,即变量eps=2.2204e-16=2^-52 这张图的名字是“零和”,显然不是指零和游戏。但显然,只有当加法(或减法)的结果非常接近于零时,才会出现这种情况 然而,据我所知,使用浮点数(或双精度)进行的计算在精度上是相似的,无论计算的规模如何。所以,我认为只有当一些非常大的东

当绘制两个非常接近于零的数学等价表达式时,我们会得到两个类似的结果,但其中一条曲线有台阶,而不是平滑的

1-cosh(x) == -2*sinh(x/2)^2

现在,快速观察表明,台阶的高度确实等于Matlab的精度,即变量
eps=2.2204e-16=2^-52

这张图的名字是“零和”,显然不是指零和游戏。但显然,只有当加法(或减法)的结果非常接近于零时,才会出现这种情况

然而,据我所知,使用浮点数(或双精度)进行的计算在精度上是相似的,无论计算的规模如何。所以,我认为只有当一些非常大的东西被一些非常小的东西操作时,错误才会蔓延,在这种情况下,较小的数字会被四舍五入

Matlab代码来重现这一点:

x = linspace(-5*10^-8, 5*10^-8, 1001);
y1 = @(x) 1 - cosh(x);
y2 = @(x) -2*(sinh(x/2)).^2;

plot(x,y1(x),'k',x,y2(x),'r')
legend('1-cosh(x)', '-2sinh(x/2)^2')

有人能解释一下这是怎么回事吗。。有效?

舍入发生在
cosh
函数中。如果以相同的比例绘制并放大图形,将看到相同的楼梯效果,但以y轴上的1为中心


这是因为不能使用双精度表示这些中间值

你忘记了,
cosh
sinh
实际上是近似于实连续函数的数值函数,但浮点数的全部目的不是在任何尺度上吗?IEEE 754标准将双精度的指数部分的位计数定义为11位,这足以表示十进制中的16个零。那么,如果double不能区分这些小的数字,为什么sinh函数没有步骤呢?事实上,你可以表示1e-100,但不能表示1+1e-100,这就是接近0的
cosh
的结果。这个数字被四舍五入到16位,得到1.000000000000001或类似的数字。然后你减去1.A-HA!所以我只是想错了!非常感谢你:D@Felix换句话说,IEEE 754标准以任何尺度表示它们,而不是以任何精度表示它们是的,这就是我所想的,但不知何故我没能得到,当然1将决定尺度。