我知道double
是MATLAB中的默认数据类型。
当你比较两个没有浮动部分的双数字时,MATLAB在我测试中的准确度达到了第17位。
a=12345678901234567 ; b=12345678901234567; isequal(a,b) --> TRUE
a=123456789012345671; b=123456789012345672; isequal(a,b) --> printed as TRUE
我发现一个保守的估计是使用数字(非浮动)直到第13位,因为其他函数在它之后变得不可靠(例如ismember
或MEX函数ismembc
等。)
浮动值是否有类似的截止值?例如,如果我使用一个非常大的小数位公司的股票,那么我何时开始失去小数精度?
a = 1234567.89012345678 ; b = 1234567.89012345679 ; isequal(a,b) --> printed as TRUE
a = 123456789012345.678 ; b = 123456789012345.677 ; isequal(a,b) --> printed as TRUE
isequal
可能不适合用于比较这些数字。一旦数字的整数部分开始增长,我更关心我应该相信我的小数值多少个地方?
答案 0 :(得分:2)
测试浮点数的相等性通常不是一个好主意。二进制浮点数的行为可能与基数10小数的预期差异很大。考虑一下这个例子:
>> isequal(0.1, 0.3/3)
ans =
0
最终,你有53位的精度。这意味着整数可以精确表示(精度没有损失),直到数字2 53 (略高于9 x 10 15 )。在那之后,好吧:
>> (2^53 + 1) - 2^53
ans =
0
>> 2^53 + (1 - 2^53)
ans =
1
对于非整数,你几乎永远不会完全代表它们,即使对于看起来很简单的小数,例如0.1(如第一个例子所示)。但是,它仍然保证至少15个精确的数字。
这意味着如果您取任何数字并将其四舍五入到可表示为双精度浮点的最近数字,则此新数字将与原始数字匹配,至少与前15位数字相匹配(无论这些数字在何处)是关于小数点)。
答案 1 :(得分:0)
您可能希望在matlab中使用变精度算术(VPA)。它计算表达式到达给定的数字计数,这可能非常大。请参阅here。
答案 2 :(得分:0)
查看MATLAB函数flintmax
,它告诉您可以以双精度或单精度存储的最大连续整数。从该页面:
flintmax
返回IEEE®double中最大的连续整数 精度,即2 ^ 53。高于此值,双精度格式 没有整数精度,并非所有整数都可以 完全代表。