Scilab中浮点计算的精度是多少?

时间:2016-06-07 18:33:37

标签: matlab floating-point precision scilab

注意:我已经使用过Matlab标签,以防它们保持相同的精度。 (据我所知,这两个程序非常相似。)

作为我前一个问题(here)的后续跟踪,我试图确定我需要设置的精确度(在我目前的C ++程序中)从Scilab代码转换为 mock Scilab程序的准确性。基本上所以两个程序都产生相同的(或非常相似)结果。

在Scilab中计算浮点计算时,维持的精度水平是多少?

我已经读过(here和其他一些地方)当在C ++中使用浮点运算时,double只能精确地保持在16位小数位左右,例如:

     4   8  12  16
     v   v   v   v
0.947368421052631578 long double
0.947368421052631526 double

与Scilab相比,这种准确度有多相似?

2 个答案:

答案 0 :(得分:2)

重新发布评论作为答案:

IEEE 754双精度浮点数是大多数常用语言的标准表示,如MATLAB,C ++和SciLab:

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwiajY7LzZbNAhWJix4KHcrEA1wQFgggMAA&url=http%3A%2F%2Fforge.scilab.org%2Findex.php%2Fp%2Fdocscifloat%2Fdownloads%2Fget%2Ffloatingpoint_v0.2.pdf&usg=AFQjCNFQiOVdgkjuxhFXhp1PwDFY-J-Qbg&sig2=vH0cpadZqi0bNqa9F0Gmig&cad=rja

所以我不希望你需要做一些特别的事来表示精度,除了使用C ++双精度(除非你的SciLab代码使用高精度浮点数)。

请注意,两个不同的IEEE 754兼容实现的表示在16位有效数字后可能有所不同:

MATLAB:

>> fprintf('%1.30f\n',1/2342317.0)
0.000000426927695952341190000000

的Python:

>> "%1.30f" % (1/2342317,)
'0.000000426927695952341193713560'

答案 1 :(得分:1)

每种通用语言(标准C ++,scilab,matlab,...)都使用相同的格式来表示十进制数。它在IEEE754中已知,其精确的文档解释如下:

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

这意味着几乎所有常用系统的精度保持不变。这是接近2 ^ -52 (或相当于2.2204e-16)的数字。它定义了“从1.0到下一个最大双精度数的距离”。

当您使用scilab时,可以使用%eps命令https://help.scilab.org/docs/5.5.1/fr_FR/percenteps.html进行确认。对于matlab,它存储在eps变量http://nl.mathworks.com/help/matlab/ref/eps.html中。对于C ++,它有点难度(参见:http://en.cppreference.com/w/cpp/types/numeric_limits/epsilon)。

因此,如果您不使用特定的机器(非典型架构或非常旧的计算机或高精度小数(64位双倍)),请不要担心精度。默认值将始终遵循相同的标准(IEEE 754)。

但是,不要忘记,即使它似乎是一个常数,错误也可能在非常高的数字和非常小的数字之间是不一样的(系统设计为具有最佳精度的区间[0,1] [并且对于区间[1,MAXIMUM [])。

可以在以下示例中显示:

>>> 1e100 == 1e100+1
True
>>> 1 == 2
False

为了确保您的代码可以移植到不同的语言,我建议您明确地参考提供机器精度的函数。例如,在scipy中:print(np.finfo(float).eps)。但是,通常,精心设计的算法在具有略微不同的epsilon的机器上不会变得很多。

例如,如果我为一些趋于0(渐近)的东西实现一个循环,在matlab中,我应该写:

while(val < eps) do
...
end

因此,主要建议应该是:不要构建一个试图从机器中使用过多信息的算法。要么你可以使用epsilon的真实值,要么你可以硬编码像2e-15这样的东西。它适用于许多不同的机器。