控制分割精度

时间:2015-11-17 10:38:25

标签: matlab precision

考虑以下简单划分:

A/0.1
ans =
  88.68

由于浮点精度,这会导致一个小错误。有没有办法防止这种情况发生?基本上我所做的就是将逗号移到一个位置,同时不接近MATLAB中允许的最大位数。

我想获得一个结果:

N

其中尾随零无关紧要,只要它们只为零,并且不包含第14位左右的某个数字。

有趣的是,当四舍五入到R = (randi([8659 49847],[1e3 1]))/1e3; xmin = min(R); el = 0.1; step = 1/el; tmp1=xmin/el; tmp2=round(tmp1); tmp3=round(tmp2*el,3); tmp3 = 8.699999999999999 数字时,这个问题也会出现:

$(function() {

    $('#selectAll').click(function() {
        if ($(this).prop('checked')) {
            $('.your_checkbox_class').prop('checked', true);
        } else {
            $('.your_checkbox_class').prop('checked', false);
        }
    });

});

4 个答案:

答案 0 :(得分:6)

使用符号数学,您可以获得精确的结果:

x=sym('8.868')/sym('.1')

答案 1 :(得分:5)

你可以随时使用fixed point算术,其中斜率是10的倍数。当你乘以/除以10时,你不会有任何不准确之处。在Matlab中,您可以使用Fixed Point Toolbox

编辑:根据您的评论 - 看起来您可以将斜率设置为0.05。

答案 2 :(得分:4)

这个答案仅在我的情况下发布完整性。

我使用unique的第三个输出

在某些情况下绕过了这个问题
el = 0.25;
A = (randi([7364 84635],[1e4 1]))/1e3;
B = A/el;
C = round(B);
D = C*el;
[tmp1,tmp2,tmp3] = unique(D);
E = tmp1(tmp3,:);
all(E==D)
ans = 
     1

正确进行分箱。因此,即使中心点可能不精确且具有无限精度,它们也至少在10位左右,这超过了我原始数据的3位精度。

答案 3 :(得分:3)

您可以将数字表示为整数的分数。只要你不转换为float,就不会失去精度:

A = 8.868;
div = 0.1;
[N1,D1] = rat(A);
[N2,D2] = rat(div);
% divide A by div:
N = N1 * D2;
D = N2 * D1;

当然,您的数字可能不准确,如其他答案/评论中所述。转换为分数也可以引入近似值,但这取决于您处理的数字以及tol的{​​{1}}参数。