Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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中,63不等于2^(log(63)/log(2))_Matlab_Precision_Logarithm - Fatal编程技术网

在Matlab中,63不等于2^(log(63)/log(2))

在Matlab中,63不等于2^(log(63)/log(2)),matlab,precision,logarithm,Matlab,Precision,Logarithm,由于浮点错误,2^(log(63)/log(2))不等于63。检查以下结果: format long; >> 2^(log(63)/log(2)) ans = 63.000000000000014 >> sym(2^(log(2251799813685247)/log(2))) ans = 2251799813685259 不幸的是,根据Matlab文档,我不能在对数上使用vpa: 与精确的符号值不同,双精度值是固有的 包含舍入错误当您以双精度调用vpa时

由于浮点错误,2^(log(63)/log(2))不等于63。检查以下结果:

format long;
>> 2^(log(63)/log(2))

ans =

  63.000000000000014
>> sym(2^(log(2251799813685247)/log(2)))

ans =

2251799813685259
不幸的是,根据Matlab文档,我不能在对数上使用vpa:

与精确的符号值不同,双精度值是固有的 包含舍入错误当您以双精度调用vpa时 输入时,vpa无法恢复丢失的精度,即使它返回 大于双精度值的数字。然而,vpa可以 识别并恢复p/q形式表达式的精度, pπ/q,(p/q)1/2,2q和10q,其中p和q是中等大小的整数

那么我该如何解决这个问题呢?我有非常大的数字,比如2^200,而且我会有非常大的错误

编辑:我不是问为什么会这样。我在问如何使这项工作100%准确,这样就不会重复

迄今为止最好的解决方案:

不幸的是,@Sardar_Usama建议的解决方案并不总是如预期的那样有效。检查以下结果:

format long;
>> 2^(log(63)/log(2))

ans =

  63.000000000000014
>> sym(2^(log(2251799813685247)/log(2)))

ans =

2251799813685259
另一方面

>> 2^(log(vpa(2251799813685247))/log(vpa(2)))

ans =

2.2517998136852470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0*10^0*10^15

更接近2251799813685247=2^51。它的误差约为~9.491*10^-494,这是迄今为止最好的解决方案,但仍然存在一些误差。

如果您不能使用
round
vpa
,那么如果您有符号数学工具箱,则有一种较慢的处理方法。i、 e

这将为您提供
sym
63
,您可以在以后使用该类转换为:


这是您将得到的:

>> format long
>> a = sym(2^(log(63)/log(2)))

a =

63

>> double(a)

ans =

    63

如果您不能使用
round
vpa
,那么如果您有符号数学工具箱,则可以通过以下方式使用较慢的方法来处理此问题。i、 e

这将为您提供
sym
63
,您可以在以后使用该类转换为:


这是您将得到的:

>> format long
>> a = sym(2^(log(63)/log(2)))

a =

63

>> double(a)

ans =

    63

具体问题是什么?一般来说,它是如何避免浮点不准确的?或者它是如何评估2^(log(k)/log(2))而不存在不精确性的?它不准确有什么错?这只是一个
2*eps(63)
差异。一般来说,数值计算不应该依赖于精确的数值。@horcler当你处理大数值时,数值会明显升高。@Paul Hankin没有不准确的地方具体的问题是什么?一般来说,它是如何避免浮点不准确的?或者它是如何评估2^(log(k)/log(2))而不存在不精确性的?它不准确有什么错?这只是一个
2*eps(63)
差异。一般来说,数值计算不应该依赖于精确的数值。@horcler当你处理大的数字时,数值会变得更高。@Paul Hankin,没有不准确的地方。不幸的是,这并不总是按预期的那样工作。查看这个
sym(2^(log(2251799813685247)/log(2))
=
2251799813685259
。(顺便说一句,2251799813685247是2^51)另一方面,
2^(log(vpa(2251799813685247))/log(vpa(2))
更接近于
2251799813685247
。它的错误大约是
~2.252*10^-192
,这不会给我的计算带来任何麻烦,但仍然有一些错误。@Kitiara只有两个选项:符号算术和数字算术(包括可变精度和双精度)。没有其他选择。要获得100%的准确度并不总是可能的。阅读这篇文章:不幸的是,这并不总是如预期的那样工作。查看这个
sym(2^(log(2251799813685247)/log(2))
=
2251799813685259
。(顺便说一句,2251799813685247是2^51)另一方面,
2^(log(vpa(2251799813685247))/log(vpa(2))
更接近于
2251799813685247
。它的错误大约是
~2.252*10^-192
,这不会给我的计算带来任何麻烦,但仍然有一些错误。@Kitiara只有两个选项:符号算术和数字算术(包括可变精度和双精度)。没有其他选择。要获得100%的准确度并不总是可能的。阅读本文: