【发布时间】:2021-10-28 13:55:09
【问题描述】:
我有 MATLAB 代码:
clear;
clc;
syms x;
f=log(x)*sin(x^2);
a=vpa(subs(f,x,2),100)
fprintf('a=%.100f\n',a);
doublea=double(a);
fprintf('a=%.100f\n',doublea);
结果是
a =
-0.5245755158634217064842071630254785076113576311088295152384038229263081153172372089356742060202648499
a=-0.5245755158634216600000000000000000000000000000000000000000000000000000000000000000000000000000000000
doublea =
-0.5246
a=-0.5245755158634216600000000000000000000000000000000000000000000000000000000000000000000000000000000000
>>
为什么如果我使用fprintf,即使我使用 100 位精度,十进制精度也只能达到 16 位?
另外,为什么如果我将a 转换为double 那么a 最多只有16 位数字?
如果我想使用超过 16 位的精度,会导致计算错误吗?如何解决?
【问题讨论】:
-
fprintf将vpa数字转换为double以打印它。double有大约 16 个十进制数字的精度,它不能存储更多的数字。如果您需要更多,您需要使用vpa。使用disp显示其值(或使用char转换为字符串并显示)。