加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮安站长网 (https://www.0517zz.cn/)- 运营、云管理、经验、智能边缘、云硬盘!
当前位置: 首页 > 运营 > 正文

人人都是数据分析师??

发布时间:2021-02-17 10:31:45 所属栏目:运营 来源:互联网
导读:以,36028797018963968和36028797018963970这两个自然数,对应到计算机浮点数来说,其实是同一个存储结果,双精度浮点数无法区分它们,最终呈现哪一个十进制数,就看浮点数的输出算法了。下图这个例子可以说明这两个数字在浮点数中是相等的。另外,大家可以
以,36028797018963968和36028797018963970这两个自然数,对应到计算机浮点数来说,其实是同一个存储结果,双精度浮点数无法区分它们,最终呈现哪一个十进制数,就看浮点数的输出算法了。下图这个例子可以说明这两个数字在浮点数中是相等的。另外,大家可以想想输入0.7,输出是0.7的问题,浮点数是无法精确存储0.7,输出却能够精确,也是因为有浮点数输出算法控制(特别注意,这个输出算法无法保证所有情况下,输入等于输出,它只是尽力确保输出符合正常的认知)。


的55次方的准确计算结果是:36028797018963968,而从上图可看到,JS的计算结果是:36028797018963970。而且直接输入36028797018963968,控制台显示结果是36028797018963970。

这个测试结果,已经对本问题给出答案。为了确保程序准确,本文建议,在整数场景下,对于JS的Number类型使用,严格限制在2^53-1以内,最好还是信规约的,直接使用String类型。

为什么会出现上面的测试现象呢?

实际上,我们在程序中输入一个浮点数a,在输出得到a',会经历以下过程:

1)输入时:按照IEEE754规则,将a存储。这个过程很有可能会发生精度损失。

2)输出时:按照IEEE754规则,计算a对应的值。根据计算结果,寻找一个最短的十进制数a',且要保障a'不会和a隔壁浮点数的范围冲突。a隔壁浮点数是什么意思呢?由于存储位数是限定的,浮点数其实是一个离散的集合,两个紧邻的浮点数之间,还存在着无数的自然数字,无法表达。假设有f1、f2、f3三个升序浮点数,且它们之间的距离,不可能在拉近。则在这三个浮点数之间,按照范围来划分自然数。而浮点数输出的过程,就是在自己范围中找一个最适合的自然数,作为输出。如何找到最合适的自然数,这是一个比较复杂的浮点数输出算法,大家感兴趣的,可参考相关论文[1]。

 

这个测试结果足以说明2^53不是一个安全整数,因为它不能唯一确定一个自然整数,实际上9007199254740992、9007199254740993,都对应这个值。因此这个问题的答案是:2^53-1。

2 在Long取值范围内,2的指数次整数转换为JS的Number类型,不会有精度丢失,但能放心使用么?

规约中指出:

在Long取值范围内,任何2的指数次整数都是绝对不会存在精度损失的,所以说精度损失是一个概率问题。若浮点数尾数位与指数位空间不限,则可以精确表示任何整数。

后半句,我们就不说了,因为绝对没毛病,空间不限,不仅是任何整数可以精确表示,无理数我们也可以挑战一下。我们重点看前半句,根据本文前面所述基础回顾,双精度浮点数的指数取值范围为[-1022,1023],而指数是以2为底数。另外,双精度浮点数的取值范围,比Long大,所以,理论上Long型变量中2的指数次整数一定可以准确转换为JS的umber类型。但在JS中,实际情况,却是下面这样:

 

最后我想再引用 一个真实的故事,是来源于 NASA 的著名文章《为什么要探索太空?》,文章的背景是来源于 1970年,赞比亚修女 Mary Jucunda 给 NASA 科学家 Ernst Stuhlinger 博士写了一封信,信中,Mary Jucunda 修女问道:目前地球上还有这么多小孩子吃不上饭,他怎么能舍得为远在火星的项目花费数十亿美元。Ernst Stuhlinger 在回信中写到一个真实的故事如下:

那是在400年前,德国某小镇里有一位伯爵。他是个心地善良的人,他将自己收入的一大部分捐给了镇子上的穷人。这十分令人钦佩,因为中世纪时穷人很多,而且那时经常爆发席卷全国的瘟疫。一天,伯爵碰到了一个奇怪的人,他家中有一个工作台和一个小实验室,他白天卖力工作,每天晚上的几小时的时间专心进行研究。他把小玻璃片研磨成镜片,然后把研磨好的镜片装到镜筒里,用此来观察细小的物件。伯爵被这个前所未见的可以把东西放大观察的小发明迷住了。他邀请这个怪人住到了他的城堡里,作为伯爵的门客,此后他可以专心投入所有的时间来研究这些光学器件。然而,镇子上的人得知伯爵在这么一个怪人和他那些无用的玩意儿上花费金钱之后,都很生气。“我们还在受瘟疫的苦,”他们抱怨道,“而他却为那个闲人和他没用的爱好乱花钱!”伯爵听到后不为所动。“我会尽可能地接济大家,”他表示,“但我会继续资助这个人和他的工作,我确信终有一天会有回报。”果不其然,他的工作(以及同时期其他人的努力)赢来了丰厚的回报:显微镜。显微镜的发明给医学带来了前所未有的发展,由此展开的研究及其成果,消除了世界上大部分地区肆虐的瘟疫和其他一些传染性疾病。伯爵为支持这项研究发明所花费的金钱,其最终结果大大减轻了人类所遭受的苦难,这回报远远超过单纯将这些钱用来救济那些遭受瘟疫的人。

综上所述,重视技术债就是重视技术,重视技术就是重视细节和未来,魔鬼存在细节当中,细节决定成败


(编辑:淮安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读