圆形,带着领带,一个原型

在2月和3月,我发表了三篇关于MATLAB的增强请求的博客文章圆形的函数,包括将领带舍入到偶数的能力。第一轮第二轮圆三. 从那时起,我们在MathWorks的一群人,由我的同事(也是学术界的大后裔)海科·韦切特组织,一直在考虑这个请求。我们最近进行了一次虚拟设计审查。这篇文章描述了一个原型,它包含了在那个评论中讨论过的特性。

内容

圆形的

传统上,帮助轮只有一条线。

ROUND(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=天花板(x)

这个函数地板(x)定义了“舍入x趋近于负无穷ceil(x)是“舍入x对正无穷”。

这个函数修复(x),也被称为“的整数部分”x”,是

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

的“小数部分”x”是

分形(x)=x-固定(x)。

两个例子

x=9.64 x=-9.64层(x)=9层(x)=-10层(x)=-10层(x)=-9层(x)=-9层(x)=-9层(x)=-9层(x)=-0.64层(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从零到四舍五入。

如果未指定缩放比例,则系数值正好是两个连续整数中间的数字,

普= -3.5,-2.5,-1.5,-0.5,0.5,1.5,2.5,3.5,……

“圆与零的距离”规则产生

Round (half) = -4, -3, -2, -1, -1, 1, 2, 3, 4,…

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

半S_偶数=-4,-2,-2,0,0,2,2,4。。。

最近的小数

下面是四个四舍五入到最接近的十进制值的示例。

总体安排短的总体安排契约
  • 特快城际里程以整数表示。从我家办公室到MathWorks总部的距离是406.3英里。这离最近的距离是多少英里?
英里=圆(406.3)
英里= 406
  • 病人的体温是98.64度。用十分之一度来表示。
温度=圆形(98.64,1)
temp = 98.6000
  • 用百分之一表示货币价值。计算利息为13.8327欧元。用百分之一欧元表示。
分=圆(13.8327,2)
分= 13.8300
  • 据报道,2019年塔拉哈西的人口为19.45万人。这对一千人来说意味着什么?
pop=圆形(194500,-3)
pop=195000

这些例子中只有一个是平局。如果与平局规则有一个圆形平局,塔拉哈西的人口将被列为194000人,而不是195000人。

IEEE 754

圆形的函数与IEEE 754浮点运算的舍-偶设置不同。的圆形的用MATLAB软件完成函数;它的输入是双精度(或单精度),输出是flint(数值为整数的浮点数)。IEEE 754的设置是在硬件中完成的,它的输入是扩展精度或带有保护位的寄存器,它的输出是双精度的,很少是燧石。

名称-值对

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

情节(x, y,‘ko’,‘markersize’,10)

现在可以写了

情节(x, y,标志=“o”,颜色=黑色,markersize = 10)

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

一开始,我并不热衷于使用名称-值对来阻止连接圆形的.但在完成这个原型和博客文章后,我现在很喜欢。的paramName可能是

圆形

有六种可能paramValues

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

例如

r_from = Round(x,roundTies=“awayFromZero”r_even = Round(x,roundTies=。“托文”)
x=0.1000 0.3000 0.5000 0.7000 0.9000 r_from=0 0 1 1 r_偶数=0 0 1 1

不是一个数字

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

r_nan =圆(x, roundTies =“toNaN”)
r_nan=0 0 nan 1 1

帮助

接下来的五个部分是原型的代码。文件名为Round.m以大写R所以我们也可以访问圆形的函数的当前版本。代码可在这里:Round.m

代码=分裂(string (fileread (“Round.m”)),“% _”);

帮助文本是简洁的。

(1) disp(代码)
函数x=四舍五入(varargin)%x的每个元素四舍五入到最接近的小数或整数。%%四舍五入(x,n)四舍五入到最接近的整数。%%四舍五入(x,n,digits=“有效”)四舍五入到n个有效数字。.%四舍五入(x,n,digits=“decimals”)与四舍五入(x,n)相同。%%四舍五入(x,…,roundTies=“awayFromZero”)%round(x,…,roundTies=“towardsZero”)%round(x,…,roundTies=“toOdd”)%round(x,…,roundTies=“TowardsPusinfinity”)%round(x,…,roundTies=“towardsMinusInfinity”)%%很少出现。只有当10^n*x在两个连续整数中间点的%舍入误差范围内时,round(x,n)才是平局。

例子

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

高级惩教主任(代码(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的关系。

高级惩教主任(代码(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);

解析

这个解析器以非常简单的方式处理名称-值对。A.更严重的解析器会更有区别。

高级惩教主任(代码(4))
函数[x,n,sig,tie] = parse(varargin) x = varargin{1};n = 0;sig = false;领带= '从';对于k = 2:nargin vk = varargin{k};If isnumeric(vk) n = vk;mapname = " mapname = " mapname = " mapname ";Elseif vk == "小数点" ||…vk == "roundTies" ||…Vk == "digits" %忽略else tie = char(Vk); caps = find(double(tie) < double('a')); if length(caps) > 1 && caps(2) > caps(1)+2 tie = lower(tie(caps(1):caps(2)-1)); elseif length(caps) > 0 && length(tie(caps:end)) <= 5 tie = lower(tie(caps(1):end)); else error(vk + " not recognized.") end end end end

规模

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

高级惩教主任(代码(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

图形

软件

原型代码可以在这里找到:Round.m




发布与MATLAB®R2021b

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。