gpt4 book ai didi

algorithm - 如何在 MATLAB 中使用 while 循环对 float 进行舍入?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:32 25 4
gpt4 key购买 nike

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

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

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

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

我不允许使用roundceilfloorforrem mod 这个问题。

最佳答案

假设 if 语句和abs 函数是允许的,因为禁用函数列表不包括此。


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

完成此操作后,我们将检查小数部分等于多少,然后根据数字的符号,相应地进行加法或减法。如果小数部分小于 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 函数一致。

关于algorithm - 如何在 MATLAB 中使用 while 循环对 float 进行舍入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37123703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com