圆的,领带断路器,原型

在2月和3月的增强请求我发表了三篇博文MATLAB的领带断路器功能,包括圆的关系的能力。圆的一个,第二轮圆三。从那时起,我们一群人在MathWorks,由我的同事(和学术great-great-grand-descendant)海科Weichelt,一直在考虑请求。最近我们有一个虚拟设计审查。这篇文章描述了一个原型结合的特性,讨论了审查。

内容

传统上,帮助轮只有一行。

轮(X)轮的每个元素X到最近的整数。

几年前,两个可选参数。

轮(X, N),正整数N,轮N位小数点向右。如果N是0,X是四舍五入为最接近的整数。如果N小于零,X是四舍五入小数点左边的。N必须是一个标量整数。
轮(X, N,“重要”)轮每个元素N最重要的数字,包括从最重要的或左侧的数字。必须一个正整数N标量。

地板和装天花板

的函数地板上装天花板在任何讨论舍入有重要的作用。每一个实数,x,这不是一个整数,两个整数之间的谎言,

地板(x) < x <装天花板(x) =地板(x) + 1

如果x是一个整数,然后呢

地板(x) = x =装天花板(x)

这个函数地板(x)定义了“舍入x对负无穷”和功能装天花板(x)是“舍入x对正无穷”。

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

修复地板(x)如果x (x) = > = 0 =装天花板(x)如果x < 0。

“分数的一部分x”是

压裂(x) = x -修复(x)。

两个例子

x = 9.64 = -9.64 (x) = 9楼(x) = -10装天花板(x) = 10装天花板(x) = 9修复(x) = 9修复(x) = 9压裂(x) = 0.64压裂(x) = -0.64

关系

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

轮(x) = (x)迹象。*地板(abs (x) + 0.5)

这意味着

轮(x) =地板(x)如果压裂(x) < 0.5 =装天花板(x)如果压裂(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,……

“圆的关系远离零”规则

圆(普)= 4、3、2、1,1,2,3,4,……

最近,有一些兴趣替代这种行为。另一个选择是“圆甚至关系最近的”。一半的数字,这将是

halfs_even = 4 2 2 0 0 2, 2, 4,……

最近的小数

这里有四个四舍五入到最近的十进制值的例子。

格式格式紧凑的
  • 城际特快里程距离在整个数字。距离我的家办公室MathWorks总部406.3英里。这是什么到最近的哩?
英里=圆(406.3)
英里= 406
  • 病人的体温是98.64度。在最近的几十分之一度。
temp =圆(98.64,1)
temp = 98.6000
  • 在数表达货币值。计算的利息是13.8327欧元。表达在欧元的百分之。
分=圆(13.8327,2)
分= 13.8300
  • 塔拉哈西的人口在2019年被报道是194500年。这个最近的一千人是什么?
流行=圆(194500 3)
流行= 195000

这些例子中只有一个是领带。round-ties-to-even规则,塔拉哈西的人口将会列为194000年而不是195000年。

IEEE 754

功能不一样的round-to-even设置IEEE 754浮点运算。的函数是用MATLAB软件;其输入是双打(或单身人士)和输出燧石(浮点数,其值是整数)。IEEE 754设置在硬件,其输入扩展精度或寄存器与警卫位及其输出是双打,很少燧石。

名称-值对

几个评论者首选名称-值对。名称-值对MATLAB语法的一部分已经有很长一段时间,最近的增强包括使用一个等号来指定它们。例如

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

现在可以写

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

左手一个名称-值对的一部分paramName和可能的右手部分的列表paramValues

起初,我并不热衷于使用tie-braking的名称-值对。但是工作在这个原型和博客后,我现在在忙。的paramName可能是

roundTies

会有六个可能的paramValues

awayFromZero towardZero低toOdd towardPlusInfinity towardMinusInfinity

例如

x = (0.1:0.2:0.9) ' r_from = (x, roundTies =“awayFromZero”)r_even = (x, roundTies =“低”)
x = 0.1000 0.3000 0.5000 0.7000 0.9000 r_from = 0 0 1 1 1 r_even = 0 0 0 1 1

不是一个数字

这发生在我在写这篇文章。七分之一选择处理关系怎么样?

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

帮助

接下来的五个部分是一个原型的代码。文件名称是Round.m以大写R所以我们也可以访问函数从当前版本。可用的代码是:Round.m

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

帮助文本简洁。

(1)disp(代码)
函数x =圆(变长度输入宗量)%轮向最近的十进制或整数。% %轮(x)圆的每个元素x到最近的整数。% %轮(x, n)转到第n个小数位。%轮(x, n,位数=“重大”)到n位有效数字。%轮(x, n,位数=“小数”)一样(x, n)。% %轮(x,…,roundTies="awayFromZero") % round(x,..., roundTies="towardsZero") % round(x,..., roundTies="toOdd") % round(x,..., roundTies="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.

例子

帮助文本继续几个例子。

(2)disp(代码)
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 = 1115/1000 - eps / 25% xhi = 1115/1000 + 24 * eps / 25% %一轮轮(x, 2) 1.120% (xlo 2 roundTies =“toOdd”) 1.110%轮(xhi 2 roundTies =“低”)1.120

主要

的身体。数字敏感部分的定义确切的和选择<< =的决心t的关系。

(3)disp(代码)
%主程序[x, n,团体,领带]=解析(变长度输入宗量{:});x0 = x;s =标志(x);x = abs (x);如果团体n = n -装天花板(log10 (x));其他n = n - 0(大小(x));结束x =规模(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);

解析

这个解析器处理以非常简单的方式名称-值对。一个更严重的解析器将更多的歧视。

(4)disp(代码)
函数[x, n,团体,领带]= x =变长度输入宗量解析(变长度输入宗量){1};n = 0;sig = false;领带= '从';k = 2:输入参数个数vk =变长度输入宗量{k};如果isnumeric (vk) n = vk;elseif vk = =“重大”团体= true;elseif vk = =“小数”| |…vk = = " roundTies " | |…vk = = "数字" %忽略其他领带= 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)disp(代码)
函数x =规模(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アカウントにサインインするか新しいMathWorksアカウントを作成します。