默认情况下,Matlab将输入设置为双精度,因此如果输入a=1/3
,则变量将以双精度转换
>> a=1/3
a =0.3333
>> whos('a')
a 1x1 8 double
然而,当我之后输入vpa(a,100)
时,我得到:
ans=0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
我的问题是
由于a
处于双精度并且只有8个字节来存储其数据,为什么它在vpa(a,100)
时具有100位数的精度?总之,Matlab如何提高a
的精确度来自' double'到100位?
答案 0 :(得分:2)
#include <stdio.h>
void main(void)
{
printf("%s\n", __FILE__);
}
的{{1}}页面对此进行了解释,此处为link.
vpa恢复常见双精度输入的精度
与精确的符号值不同,本质上是双精度值 包含舍入错误。当您以双精度调用vpa时 输入,vpa无法恢复丢失的精度,即使它返回 比双精度值更多的数字。但是,vpa可以 识别并恢复p / q形式的表达式的精度, pπ/ q,(p / q)1 / 2,2q和10q,其中p和q是中等大小的整数。
首先,证明vpa无法恢复a的精度 双精度输入。调用vpa的双精度结果和 相同的象征性结果。
所以答案是,Matlab足够聪明,可以恢复你的表达,因为它的格式为df$p_value <- apply(df,1,function(x) fisher.test(matrix(x[-1],nrow=2))$p.value)
。