如何在MATLAB中使用while循环舍入浮点数?

时间:2016-05-09 19:15:43

标签: algorithm matlab precision

我有一个相当不正统的家庭作业,我要编写一个简单的函数,其中double值四舍五入为整数,仅使用while循环。

主要目标是写一些类似圆函数的东西。 我做了一些进展,我应该添加或减去一个非常小的double值,我最终会得到一个将成为整数的数字:

while(~isinteger(inumberup))
    inumberup=inumberup+realmin('double');
end

但是,这会导致永无止境的循环。有没有办法完成这项任务?

我不允许对此问题使用roundceilfloorforremmod。< / p>

2 个答案:

答案 0 :(得分:3)

假设: if语句和abs函数是允许的,因为禁止函数列表不包含此内容。

这是一个解决方案。您可以做的是将输入值减去1直到达到小于1的点。此点后产生的数字是数字的小数部分(即,如果我们的数字为3.4,分数成分为0.4)。然后,您将检查我们称之为f的小数分量是否小于0.5。如果是,则表示您需要向下舍入,因此您将使用f减去输入数字。如果该数字大于0.5或等于0.5,您将添加输入数字(1 - f),以便达到下一个最高数字。但是,这仅处理正值的情况。对于负值,MATLAB中的round向负无穷大舍入,因此我们应该采用输入数的绝对值并执行此减法以查找小数部分。

一旦我们这样做,然后我们检查分数部分等于什么,然后根据数字的符号,我们相应地加或减。如果小数部分小于0.5并且数字为正数,我们需要减去f,否则我们需要按f添加。如果小数部分大于或等于0.5,如果数字为正数,我们需要加(1 - f),否则我们减去(1 - f)

因此,假设num是感兴趣的输入数字,您可以这样做:

function out = round_hack(num)

%// Repeatedly subtract until we get a value that less than 1
%// i.e. the fractional part
%// Also make sure to take the absolute value
f = abs(num);
while f > 1
    f = f - 1;
end

%// Case where we need to round down
if f < 0.5
    if num > 0
        out = num - f;
    else
        out = num + f;
    end
%// Case where we need to round up
else
    if num > 0        
        out = num + (1 - f);
    else
        out = num - (1 - f);
    end
end

请注意,对于较大的num值,这将会很慢。我还把它包装成一个易于调试的函数。以下是一些示例运行:

>> round_hack(29.1)

ans =

    29

>> round_hack(29.6)

ans =

    30

>> round_hack(3.4)

ans =

     3

>> round_hack(3.5)

ans =

     4

>> round_hack(-0.4)

ans =

     0

>> round_hack(-0.6)

ans =

    -1

>> round_hack(-29.7)

ans =

   -30

对于上述测试用例,您可以检查这与MATLAB的round函数是否一致。

答案 1 :(得分:0)

你可以不用循环来做:你可以使用num2str将数字转换为字符串,然后在字符串中找到.的位置,并从字符串开头提取字符串到.的位置;然后你用str2num

将它转换回一个数字

要对其进行舍入,您必须在.之后检查第一个字符(转换为数字)的值。

r=rand*100
s=num2str(r)
idx=strfind(num2str(r),'.')
v=str2num(s(idx+1))
if(v <= 5)
   rounded_val=str2num(s(1:idx-1))
else
   rounded_val=str2num(s(1:idx-1))+1
end

希望这有帮助。

Qapla&#39;