注意:我已经使用过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相比,这种准确度有多相似?
答案 0 :(得分:2)
重新发布评论作为答案:
IEEE 754双精度浮点数是大多数常用语言的标准表示,如MATLAB,C ++和SciLab:
所以我不希望你需要做一些特别的事来表示精度,除了使用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这样的东西。它适用于许多不同的机器。