负零

我的妻子在想表达我的兴趣时,随时提出以下故事:当我的一个女儿上小学二年级时,她的数学老师告诉班级,任何被零除的数字都是一。 我给老师发了一封热情洋溢的电子邮件,坚持认为结果必须是不确定的。 据推测这是我有时很难相处的证据。

事实证明,这可能是我的笑话-尽管仍然很难支持二年级老师的回答。 我最近学到了一些我不知道的有关浮点数学的知识:

  • 负零有一个值,与常规(正?)零分开。 这两个零被定义为彼此相等,但它们是不同的值。
  • 对于x≠±0.0,x÷0.0并非错误。 取而代之的是,遵循通常的符号约定,结果为正无穷大或负无穷大。
  • ±0.0÷±0.0的情况是一个错误(特别是“不是数字”或NaN)。
  • –0.0 + –0.0 = –0.0,–0.0 + 0.0 = 0.0和–0.0×0.0 = –0.0

这些规则源于IEEE 754 “浮点算法标准”,该标准对跨平台的浮点表示进行了标准化。 该标准的最新版本于2008年完成,但原始版本于1985年发布,因此这种行为并不新鲜。 以上规则在Mac上的C(gcc)和Swift中都适用,在iPhone上的Swift中也适用。 Mac上的Python支持浮点数的负零,但是当您尝试除以任何符号的零时会抛出异常。

这些规则有两个令人惊讶的推论:

  • 因为0.0和-0.0必须比较相等,所以测试(x <0.0)不会对每个负数返回true –对于负零则失败。 因此,要确定零值的正负号,您需要使用平台的内置正负号函数,例如Swift中的Double.sign。 或者我猜您可以对double的原始表示进行位操作,这在很大程度上是C程序员的答案。
  • 如果a = b÷c,则不必遵循b = a×c的情况,因为对于c为任一符号为零的情况,这也将失败。

我不是数字理论家,但我发现上述概念令人惊讶。

一个迫在眉睫的问题是:无穷不是一个数字,例如零或3.25或π。 相反,无限是一个概念。 确实,有理数是无穷大的-但无穷不是有理数集合的成员。

此外,从数论角度看,被零除是无意义的。 您可以理解为什么要对除法的含义有所了解。 从技术上讲,“除”是“乘以数字的逆数”,其中该逆数满足:a×a ^ -1 =1。零是一组实数中唯一没有乘法逆数的数字。 而且由于这种逆不存在,所以我们无法四处乘以它。

但是可以肯定的是,设计浮点数的人都知道这一切。 因此,我想知道为什么所描述的行为会被写入IEEE标准。

首先,让我们考虑浮点数学试图解决的问题。 实数是无限的,但我们希望在有限的计算机内存范围内表示整个集合。 对于64位双精度数,有2 ^ 64个可能的符号,IEEE标准的设计者正试图将这些符号映射到一组实数上,这既对现实应用程序有用,又在经济上可行。考虑到80年代早期硅片的限制。 给定基本要求,显然将使用近似值。

负零的原因似乎可以追溯到1987年由伯克利大学教授William Kahan撰写的论文[1],他被认为是“浮点之父”,后来因其在起草IEEE 754中的工作而获得了图灵奖。负零的存在与除零的能力密切相关。

让我们从讨论不允许零除的常见原因开始。 天真地除以零的方法是观察到:

换句话说,随着x变小,1 / x的结果也变大。 但这仅在x从正方向接近0时才是正确的(这就是为什么上面只有很少的加号)。 从负面方面进行相同的思想实验:

结果,由于函数1 / x中存在不连续性(Kahan称其为split ),因此x接近0时的1 / x的一般限制是不确定的。

但是,通过引入一个有符号的零,Kahan和IEEE委员会可以解决这一难题。 直观地,取零的符号表示接近极限的方向。 正如Kahan在1987年的论文中指出的那样:

与其将+0和-0视为不同的数值,不如将它们的符号位视为辅助变量,该辅助变量传达有关任何以0为数值的数值变量的信息(或错误信息)。 通常,这些信息是无关紧要的。 x:= +0的3 + x值与x:= -0…的值相同。 但是,一些非凡的算术运算受到零的符号的影响。 例如1 /(+0)= +∞,而1 /(–0)= –∞。

通过采用我的搭档Mike Perkins提出的合理化,我对这个概念感到满意:2 ^ 64个可用符号显然不足以表示实数集的全部。 因此,IEEE设计师将其中一些符号留作特殊含义。 从这个意义上讲,∞并不是真正的“无穷大”,而是“比我们在浮点符号集中所能表示的更大的实数”。 因此,+ 0并不是真正的“零”,而是“大于真实0但小于我们可以表示的任何正数的实数。”

顺便说一句,在研究此问题时,我发现甚至连Kahan都不喜欢负零的想法:

带符号的零-好吧,带符号的零是我们使用投射模式可以消除的麻烦。 如果只有一个无穷大和一个零,那么您可以做得很好; 那么您就不会在乎零的符号,也不会在乎无穷大的符号。 但是,另一方面,如果您坚持我认为是两个无限性的较小选择,那么您最终将得到两个带符号的零。 真的没有办法解决这个问题,而您却坚持下去。” (摘自2005年对Kahan 的采访 。)

我不确定十年后写博客是否可以弥补一个贫穷的二年级老师的不足。 就我而言,我的女儿现在正在读高中,当我开始谈论晚餐时被零除的时候,她只是睁开了眼睛。 因此,也许“难以生存”是遗传的。

[1]卡汉(W. Kahan),“复杂的基本函数的分枝,或者什么都没做”, 《数值分析的最新技术》 ,(伊斯尔和鲍威尔编着),克拉伦登出版社,牛津,1987年,可用。 在这里

From: https://hackernoon.com/negative-zero-bbd5fd790af3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值