根据分辨率计算 digits/decimal 个位置
calc digits/decimal places from resolution
有没有一种简单的方法可以计算在给定分辨率下显示浮点数所需的位数? (不经过字符串转换)
resolution = [0.1 0.01 0.05 0.025 0.10001];
% first try
digits = -floor (log10 (resolution))
% wanted output
ex_digits = [1 2 2 3 5];
给予
digits =
1 2 2 2 1
前三个结果很好,但另一个在我第一次尝试时失败了。
您可以将数字乘以 10 的幂,然后将结果与其底数进行比较。
resolution = [0.1 0.01 0.05 0.025 0.10001];
k = resolution .* 10.^(1:20).';
[~, digits] = max(round(k)==k);
您也可以使用公差来考虑精度误差:
r = round(k);
tol = eps(r) * 2;
[max_val, digits] = max(abs(r-k) < tol);
digits = max_val .* digits + ~max_val .* 20;
这样的事情似乎已经足够接近了:
ceil( log10( [~, D] = rat( resolution, eps ) ) )
有没有一种简单的方法可以计算在给定分辨率下显示浮点数所需的位数? (不经过字符串转换)
resolution = [0.1 0.01 0.05 0.025 0.10001];
% first try
digits = -floor (log10 (resolution))
% wanted output
ex_digits = [1 2 2 3 5];
给予
digits =
1 2 2 2 1
前三个结果很好,但另一个在我第一次尝试时失败了。
您可以将数字乘以 10 的幂,然后将结果与其底数进行比较。
resolution = [0.1 0.01 0.05 0.025 0.10001];
k = resolution .* 10.^(1:20).';
[~, digits] = max(round(k)==k);
您也可以使用公差来考虑精度误差:
r = round(k);
tol = eps(r) * 2;
[max_val, digits] = max(abs(r-k) < tol);
digits = max_val .* digits + ~max_val .* 20;
这样的事情似乎已经足够接近了:
ceil( log10( [~, D] = rat( resolution, eps ) ) )