Cleve's Corner:数学和计算上的Clyver

科学计算,数学和更多

圆形,带拉杆断路器,原型

在2月和3月,我发表了三篇关于MATLAB的增强请求的博客文章圆形的功能,包括将领带圆整至均匀的能力。第一回合六层圆三.从那以后,我们在Mathworks的一群美国,由我的同事(以及学术伟大的伟大后代)Heiko Weichelt组织一直在考虑要求。我们最近有一个虚拟设计评论。该帖子描述了包含在该审查中讨论的特征的原型。

内容

圆形的

传统上,帮忙转转只有一条线。

舍入(X)将X的每个元素舍入为最接近的整数。

几年前,添加了两个可选参数。

ROUND(X, N),对于正整数N,在小数点右边四舍五入到N位。如果N为零,X四舍五入到最接近的整数。如果N小于0,X被四舍五入到小数点的左边。N必须是一个标量整数。
ROUND(X, N, 'significant')将每个元素四舍五入到它的N位最有效的数字,从最有效的数字或数字的左边开始计算。N必须是一个正整数标量。

地板和装天花板

的函数地板装天花板在任何关于舍入的讨论中都有重要作用。每个实数,x,它不是整数,位于两个整数之间,

Floor (x) < x < cell (x) = Floor (x) + 1

如果x是一个整数,那么

地板(x)= x = CEIL(x)

功能楼层(x)定义了“舍入x趋近于负无穷CEIL(x)是“四舍五入”x对正无穷”。

功能修复(x),这也被称为“整数部分x”,是

Fix (x) = floor(x) if x >= 0, = cell (x) if x < 0。

的“小数部分”x”“是吗

FRAC(x)= x  -  FIX(x)。

两个例子

x = 9.64 x = -9.64楼(x)= 9楼(x)= -10 ceil(x)= 10 ceil(x)= -9 fix(x)= 9 fix(x)= -9 frac(x)= 0.64 FRAC(x)= -0.64

领带

传统的代码圆形(x)是一行。

圆形(x)=符号(x)。*地板(abs(x)+ 0.5)

这意味着

如果frac(x) < 0.5,则Round (x) = floor(x) = cell (x),如果frac(x) > 0.5

这明确地定义了圆形(x)几乎所有x.唯一不明确的情况是圆领带.当x正好是1/2,或十进制的0.5。领带相对较少。传统上,MATLAB将关系从零舍入。

当没有指定缩放时,TIES是两个连续整数之间的数字恰好,

halfs=-3.5,-2.5,-1.5,-0.5,0.5,1.5,2.5,3.5。。。

“远离零的圆结”规则产生

圆形(半圆形)=-4,-3,-2,-1,1,2,3,4。。。

最近,人们对替代这种行为产生了一些兴趣。另一种选择是“圆形与最接近的偶数挂钩”。对于中间的数,这是

halfs_even = -4,-2,-2,0,0,0,2,2,4,...

最近的小数

以下是四舍五入到最接近的十进制值的例子。

格式短的格式袖珍的
  • 以整数表示城际里程距离。从我的总部到MathWorks总部的距离是406.3英里。这到最近的英里是多少?
英里=圆(406.3)
英里=406
  • 患者的体温为98.64度。用十分之一度表示。
temp = round(98.64,1)
温度=98.6000
  • 用百分之一表示货币价值。计算利息为13.8327欧元。用百分之一欧元表示。
美分=圆形(13.8327,2)
分= 13.8300
  • 据报道,2019年塔拉哈西的人口为19.45万人。这对一千人来说意味着什么?
POP = ROUNG(194500,-3)
POP = 195000.

这些例子中只有一个涉及领带。随着往返甚至甚至统治的,塔拉哈西人口将被列为194,000,而不是195,000人。

IEEE 754.

圆形的函数与IEEE 754浮点算法的从四舍五入到偶数设置不同。这个圆形的用MATLAB软件实现了功能;它的输入是双精度(或单精度),输出是flints(浮点数,其值是整数)。IEEE 754设置是在硬件中完成的,它的输入是扩展精度或带有保护位的寄存器,它的输出是双精度,很少是flints。

名称-值对

一些评论员更喜欢名称-值对。名称-值对长期以来一直是MATLAB语法的一部分,最近的一项改进涉及使用等号来指定它们。例如

图(x,y,'ko','markersize',10)

现在可以写

绘图(x,y,marker='o',color='black',markersize=10)

名称-值对的左边部分是paramName右手可能的部分是paramValues

起初,我并不热衷于使用名称-值对进行连接圆形的.但是在完成了这个原型和博客文章之后,我现在赞成了paramName可以是

圆角

可能有六种paramValues

从零向零到甚至向正无穷向负无穷

例如

x=(0.1:0.2:0.9)'r_from=圆形(x,圆形=“远离零”r_even = Round(x,roundTies=。'toeven'
X = 0.1000 0.3000 0.5000 0.9000 0.9000 R_FROM = 0 0 1 1 1 R_EVEN = 0 0 0 1 1

不是一个数字

我在写这篇文章时想到了这一点。第七种处理领带的方法怎么样?

r_nan =圆(x, roundTies =“托南”
r_nan = 0 0 nan 1 1

帮助

接下来的五部分是原型的代码。文件名为有资本R所以我们也可以访问圆形的当前版本的功能。代码可在以下位置获得:

代码=拆分(字符串(文件读取(“Round.m”)),“% _”);

帮助文本很简洁。

(1) disp(代码)
函数x = round(varargin)%舍入最近的十进制或整数。%round(x)将x的每个元素舍入到最接近的整数。%%圆形(x,n)舍入到第n个小数。%圆(x,n,数字=“重要”)舍入到n有效数字。%圆形(x,n,数字=“decimals”)与圆形相同(x,n)。%%round(x,...,圆角=“arefomzero”)%round(x,...,圆角=“朝向zero”)%round(x,...,圆角=“todd”)%rows(x,.。.,圆角="toEven") % round(x,..., roundTies="towardsPlusInfinity") % round(x,..., roundTies="towardsMinusInfinity") % % Ties are rare. round(x,n) is a tie only when 10^n*x is within % roundoff error of a point halfway between two consecutive integers.

例子

帮助文本继续提供了一些例子。

DISP(代码(2))
x = 123456.789% % % % %例子一轮轮(x, 3) (x) 123457% 123000%圆(x, 2) 123456.79% % x = 1.125% %一轮轮(x, 1) (x) 1.000% 1.100%轮轮(x, 2) 1.130% (x 2 roundTies =“低”)1.120%轮(x 2 roundTies =“toOdd”)1.130%的圆轮(x, 3) 1.125% (x 3“重大”)1.130% % x = 1.115% xlo xhi = 1115/1000 = 1115/1000 - eps / 25%+ 24*eps/25 % % round(x,2) 1.120 % round(xlo,2,roundTies="toOdd") 1.110 % round(xhi,2,roundTies="toEven") 1.120

主要的

这是本书的正文圆形的.数字敏感部分是精确的和选择<<=在决定t,领带。

DISP(代码(3))
%主程序[x,n,sig,tie] = parse(varargin{:});x0 = x;s =标志(x);x = abs (x);如果sig n = n - cell (log10(x));Else n = n - 0 (size(x));End x = scale(x,n);z = x;F = z -楼层(z);M = (f < 0.5); x(m) = floor(z(m)); m = (f >= 0.5); x(m) = ceil(z(m)); exact = (x0 == single(x0)); if exact t = (f == 0.5); % ties else t = abs(f - 0.5) <= eps(z); % ties end x(t) = ceil(z(t)); switch tie case 'even' m = (mod(x(t),2) == 1); case 'odd' m = (mod(x(t),2) == 0); case 'plus' m = (s(t) < 0); case 'minus' m = (s(t) > 0); case 'zero' m = 1; case 'nan' m = NaN; otherwise m = 0; end x(t) = x(t) - m; x = s.*scale(x,-n);

解析

此解析器以非常简单的方式处理名称值对。一种更严重的解析器会更有区别。

DISP(代码(4))
函数[x,n,sig,tie]=parse(varargin)x=varargin{1};n=0;sig=false;tie='from';for k=2:nargin vk=varargin{k};if isnumeric(vk)n=vk;elseif vk==“sig=true”;elseif vk==“decimals”| | |…vk==“roundTies”| |…vk=“digits”%ignore tie=char(else)tie=char(vk);caps=find(double=find)sign)sig=sig=sig=sig=true=true=true;elseif=double=find=sig=sig=>1&&caps(2)>caps(1)+2 tie=lower(tie(caps(1):caps(2)-1));elseif长度(caps)>0&&length(tie(caps:end))<=5 tie=lower(tie(caps(1):end));else错误(vk+“未识别”)end

规模

此缩放函数总是乘以或除以10的正整数幂,这对于n < = 16

DISP(代码(5))
函数x = scale(x,n) k = (n > 0);x (k) = x (k)。* 10 ^ n (k);K = (n < 0);x (k) = x (k)。/ 10 ^ (- n (k));结束

图解的

这是以前帖子的图片,现在用标签paramValues

图解的

软件

此处提供了原型代码:




发布与MATLAB®R2021b

|

评论

如需留言,请点击这里登录到您的MathWorks帐户或创建新帐户。