Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 上限至最接近50_Matlab_Rounding - Fatal编程技术网

Matlab 上限至最接近50

Matlab 上限至最接近50,matlab,rounding,Matlab,Rounding,我可以将A的元素四舍五入为大于或等于A ceil(A) 但是如果我想把它四舍五入到大于或等于A的最接近的50呢 例如,给定以下A数组 A=[24, 35, 78, 101, 199]; 子例程应返回以下内容 B=Subroutine(A)=[50, 50, 100, 150, 200]; 您只需除以50,取ceil(),然后再乘以50: octave:1> A=[24, 35, 78, 101, 199]; octave:2> ceil(A) ans =

我可以将
A
的元素四舍五入为大于或等于
A

ceil(A)
但是如果我想把它四舍五入到大于或等于
A
的最接近的50呢

例如,给定以下
A
数组

A=[24, 35, 78, 101, 199];
子例程应返回以下内容

B=Subroutine(A)=[50, 50, 100, 150, 200];

您只需除以50,取ceil(),然后再乘以50:

  octave:1> A=[24, 35, 78, 101, 199];
  octave:2> ceil(A)
  ans =

    24    35    78   101   199

  octave:3> 50*(ceil(A/50.))
  ans =

    50    50   100   150   200

一种简单的方法是将每个数的补模50相加:

octave> A = [24, 35, 78, 101, 199] 

octave> mod(-A, 50)       # Complement (mod 50)
ans =

   26   15   22   49    1

octave> A + mod(-A, 50)   # Sum to "next higher" zero (mod 50)
ans =

    50    50   100   150   200

octave> A - mod(A, 50)    # Can also sum to "next lower" zero (mod 50)
ans =

     0     0    50   100   150

(请注意,这仅取决于整数运算,它可以避免由于浮点舍入而产生的错误。)

请注意,对于.Meh中的大值,这可能会引入浮点舍入错误,因此请去掉除法中50后的小数点。要么数字已经是浮点值,在这种情况下,问题已经出现在代码中的其他地方,要么数字是整数,在这种情况下,只需去掉小数点,现在就可以进行整数除法和加法,在这种情况下,就没有浮点数问题了。所以我看不出这里有什么问题。问题是结果不正确。:-)例如,尝试将
77777
作为输入:此方法给出不正确的结果
777792
,而模数方法正确给出
77800
。是的,您的方法也是如此:“a=77777;a+mod(-a,50)”也给出7792。你可能想看看维基百科关于机器epsilon()的文章,注意你永远不会让数字运算在浮点数的第16位小数点产生正确的结果,即使是双精度的。当然,对于(比如)64位整数,这两种方法都给出了正确的结果,因为整数算术中的50*ceil(a/50)与a+mod(-a,50)完全相同。@Piet和Jonathan:我在MATLAB中测试了你的两个答案(问题所问的),我从每个答案中得到了完全相同的结果。但是,使用
777
这样的数字测试输出没有多大意义,因为这是一个更大的整数。你需要一个64位整数来处理这个数字。我喜欢这个,因为它利用了模加/减法,也就是说,没有乘法/除法。但是,如果您有一个复杂的表达式来代替,您可能希望恢复到使用ceil函数的解决方案,因为在该方法中,该表达式只会被调用一次。所有这些都是为了代码简单化的目标。