银行格式和度量套筒扳手

关于可能的错误的报告格式银行访问当地的五金店让我意识到,用二进制浮点数进行十进制算术数就像用美国插座扳手拧紧欧洲螺栓。

内容

纳税时间

这是4月中旬,所以我们当中提交​​美国所得税的人有琐事要做。几年前,我使用MATLAB来帮助税收。我有一个名字的程序form1040.m这对税表上的每行有一个声明。我只需要输入我的收入和扣除。然后Matlab将完成所有算术。

如果我们对我们的财务记录非常细心,我们会跟踪最近的一分钱。所以第28行Form1040可能是像

利息= 48.35
利息= 48.3500

我不喜欢输出中的那些尾随零。所以我介绍了

格式银行

进入Matlab。现在

兴趣
利息= 48.35

小数点之后只用两位数打印。

格式银行事实证明,它更广泛地有用,并且仍在当今的Matlab中。

打破领带

最近,我们有一个用户询问有关采用的舍入规则格式银行。如果一个值在两个可能的输出之间失败,该怎么办?选择哪个,为什么?

这是提示用户查询的示例。从...开始

格式短的

因此我们可以看到四个小数点。

x =(5:10:45)'/1000 y = 1+x z = 2+x
x = 0.0050 0.0150 0.0250 0.0350 0.0450 y = 1.0050 1.0150 1.0250 1.0350 1.0350 1.0450 z = 2.0050 2.0150 2.0150 2.0250 2.0350 2.0350 2.0450

这些值似乎落在两位数十进制分数对之间的一半。让我们看看领带是如何打破的。

格式银行X Y Z
x = 0.01 0.01 0.03 0.04 0.04 y = 1.00 1.01 1.02 1.03 1.04 z = 2.00 2.02 2.02 2.02 2.04 2.04 2.04

查看最后一位数字。这里有什么神秘的手在这里工作?三个Xx(1),,,,x(3), 和x(4),已被舍入。没有任何一个y已经被四舍五入了。两个zZ(2)Z(4),已被舍入。

据报道,电子邮件在数学工作中在内部发行了几天,提出了各种解释。这是一个错误吗格式银行?在I/O库中?这是否取决于使用哪个编译器来构建MATLAB?我们在PC和Mac上看到相同的行为吗?总是这样吗?当我们看到好奇的行为时,这些是通常的问题。

你知道发生了什么吗?

以上都不是。

好吧,我刚才提到的任何嫌疑人都没有罪魁祸首。事实是,这些数字都不完全落在中点上。思考二进制,而不是十进制。像小数分数表示的0.005之类的值不能完全表示为二进制浮点数。十进制的分数落在二元分数之间,很少完全落入一半。

符号工具箱

要了解正在发生的事情,符号工具箱功能

sym(x,'e')

是你的朋友。这'e'为此提供标志。这帮助条目说

'e'代表“估计错误”。“ R”形式由涉及变量“ EPS”的术语补充,该术语估计理论合理表达式及其实际浮点值之间的差异。例如,sym(3*pi/4,'e')为3*pi/4-103*EPS/249。

查看这是如何在这里遇到的情况下工作的。

symx = sym(x,'e')symy = sym(y,'e')symz = sym(z,'e'
SYMX = EPS/2133 + 1/200 3/200 -EPS/400 EPS/160 + 1/40(3*EPS)/200 + 7/200 9/200-(3*EPS)/400 symy = 201/200- (12*EPS)/25 203/200  - (11*EPS)/25 41/40  - (2*EPS)/5 207/200  - (9*EPS)/25 209/200  - (8*EPS)/25 SYMZ = 401/200  - (12*EPS)/25(14*EPS)/25 + 403/200 81/40  - (2*EPS)/5(16*EPS)/25 + 407/200 409/20009/20009/200-(8*EPS)/25

输出并不像我想看到的那样清晰,但是我可以挑选错误条款的迹象并找到

x +  -  + +  -  y ------------- +  -  +  -

或者,我可以用

格式短的sigx = sign(double(symx -x))sigy = sign(double(symy -y))sigz = sign(double(symz -z))
sigx = 1 -1 1 1 -1 sigy = -1 -1 -1 -1 -1 -1 sigz = -1 1 -1 1 -1 -1

错误术语的符号告诉我们是否存储了浮点数X,,,,yz比预期的小数分数更大或小。在此初始输入之后,基本上没有更多的回合错误。格式银行将相应地从小数价值上下汇总。同样,它只是在给出的输入上完成工作。

套筒扳手

照片来源:http://toolguyd.com/

高端套筒扳手套件包括度量标准(左)和分数英寸(右)尺寸。同样,考虑十进制和二进制。螺母和螺栓和扳手的度量标准尺寸以小数为单位的分数指定,而分数英寸尺寸的分母是两个的功率。

互联网上的度量标准和分数标准之间的转换图。这是其中之一的链接:扳手转换图

但是我们可以轻松地计算自己的转换图。并在此过程中计算三角洲,在十进制螺栓上使用最接近的二进制扳手时造成的相对误差。

make_chart
Inch Metric delta 1/64 0.016 1/32 0.031 3/64 0.047 1mm 0.039 -0.191 1/16 0.063 5/64 0.078 2mm 0.079 0.008 3/32 0.094 7/64 0.109 1/8 0.125 3mm 0.118 -0.058 9/64 0.1415/32 0.156 4MM 0.157 0.008 11/64 0.172 3/16 0.188 13/64 0.203 5mm 0.197 -0.032 7/32 7/32 0.219 15/64 0.234 0.234 6mm 0.236 0.236 0.008 1/4 0.250 9/4 0.250 9/32 0.281 7mm 0.281 7mm 0.27mm 0.276 -021 5/8mm 0.315 0.008 11/32 0.344 9mm 0.354 0.030 3/8 0.375 13/32 0.406 10mm 0.394 -0.032 7/16 0.438 15/32 0.469 12mm 0.472 0.008 1/2 0.500 9/16 0.563 14mm 0.551 -0.021 5/8 0.625 16mm0.630 0.008 11/16 0.688 18mm 0.709 0.030 3/4 0.750 13/16 0.813 20mm 0.787 -0.032 7/8 0.875 0.875 22mm 0.866 -0.010 15/16 0.938 24mm 0.945 0.945 0.008 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000 1 1.000

让我们绘制这些相对错误。除了小尺寸(该集合没有足够的扳手)外,相对误差仅为百分之几。但这仍然足以在紧身的螺母上产生破坏性的适合。

bar(k,d)轴([0 25 -.05 .05])Xlabel(“毫米”)ylabel('三角洲'

您可能会注意到,像所有这些图表一样,我的转换图和扳手本身也具有一些浮点字符。条目的间距不均匀。二进制值之间的间距为1/64,然后是1/32,然后是1/16。度量值的间距在图表的顶部为1mm,后来为2mm。

10毫米

假设我们要拧紧10mm的螺母,而我们所拥有的只是二进制扳手。螺母的直径为英寸

仪表= 39.370079;d = 10*米/1000
d = 0.3937

咨询我们的图表,我们看到13/32扳手是最合适的,但它太大了。10mm位于这两个二元值之间。

[地板(32*d)ceil(32*d)] B1 = 12/32;B2 = 13/32;[B1 D B2]'
ANS = 12 13 ANS = 0.3750 0.3937 0.4063

间隔的比例是

f =(d -b1)/(b2 -b1)
F = 0.5984

10mm约为从12/32英寸到13/32英寸的60%。

十分之一

现在,让我们转到浮点数。执行此MATLAB语句时会发生什么?

x = 1/10
x = 0.1000

一个除以十,最接近的浮点数存储在X。声明产生相同的值

x = 0.1
x = 0.1000

所结果的X位于1/16至1/8之间的间隔。此间隔中的浮点数均匀地间隔

E = EPS(1/16)
E = 1.3878E-17

这是2^-56。让

e = sym(e)
E = 1/72057594037927936

这个值e扮演1/64为我的扳手扮演的角色。

的结果x = 1/10位于这两个二元分数之间。

b1 =地板(1/(10*e))*e b2 = ceil(1/(10*e))*e
B1 = 7205759403792793/72057594037927936 B2 = 3602879701896397/36028797018963968

长度的微小间隔e

C = [B1 1/10 B2]'
C = 7205759403792793/72057594037927936 1/10 3602879701896397/36028797018963968

小数点

VPA(C)
ANS = 0.09999999999999999991673327315311326 0.1 0.10000000000000000555551151512312578

1/10在哪里躺在哪里?

f = double((1/10 -b1)/e)
F = 0.6000

因此,1/10大约是60%B1B2因此更接近B2而不是B1。这两个语句

x = 1/10 x = double(b2)
x = 0.1000 x = 0.1000

将完全相同的值存储在X

13/32扳手是二进制收集中最接近10mm螺母的工具。




与Matlab®R2017A一起出版

|

注释

要发表评论,请单击这里登录您的数学帐户或创建一个新帐户。