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

在2月和3月,我发表了三篇关于MATLAB的增强请求的博客文章函数,包括将领带舍入到偶数的能力。圆的一个第二轮圆三.从那时起,我们MathWorks的一群人,由我的同事(学术上的曾曾孙后裔)Heiko Weichelt组织,一直在考虑这个请求。我们最近进行了一次虚拟设计评估。这篇文章描述了一个包含了之前讨论过的功能的原型。

内容

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

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是整数吗

Floor (x) = x = ceiling (x)

这个函数地板(x)定义了“舍入x趋近于负无穷装天花板(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 floor(X) = 9 floor(X) = -10 ceix = 10 ceix = -9 fix(X) = 9 fix(X) = -9 frac(X) = 0.64 frac(X) = -0.64

关系

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

*floor(abs(x) + 0.5) *floor(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从零到四舍五入。

当没有指定比例时,tie是两个连续整数的正中间,

普= -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,…

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

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年塔拉哈西的人口为19.45万人。这对一千人来说意味着什么?
流行=圆(194500 3)
流行= 195000

这些例子中只有一个是平局。按照四平八稳的规则,塔拉哈西的人口将从19.5万增加到19.4万。

IEEE 754

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

名称-值对

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

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

现在可以写成

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

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

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

roundTies

有六种可能paramValues

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

例如

r_from = Round(x,roundTies=“awayFromZero”r_even = Round(x,roundTies=。“低”
r_from = 00 1 1 1 r_even = 000 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的每个元素取到最接近的整数。% % round(x, n)取整至小数点第n位。% round(x, n, digits="significant")取整到n位有效数字。% round(x,n, digits="decimal ")与round(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 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) disp(代码)
%主程序[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);

解析

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

(4) disp(代码)
函数[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) disp(代码)
函数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帐户或创建一个新帐户。