百科问答小站 logo
百科问答小站 font logo



为什么在项目中要尽量避免使用浮点数,不使用浮点数,那该如何计算浮点数? 第1页

  

user avatar   pansz 网友的相关建议: 
      

「在项目中要尽量避免使用浮点数」本来就是个伪命题,很大程度上是以讹传讹得来的,比方说上面回答中那个猴子的故事就很形象。

这个以讹传讹的本体来源于工程需求,往往是要让人尽量用整数,却忽略了整数跟浮点同样都是有限精度。

如果你需要无限精度,那么只有自定义类型能满足。整数vs浮点并没有太大的优势。

实际上,浮点的误差来自十进制小数跟二进制小数之间的转换。如果这个转换对你具体的应用来说不是必须的,那么你就完全可以用浮点。

因而,不应该使用浮点数的常用场合只有一个,那就是:当你需要让一个变量精确的对应到现实中某个十进制小数时,不应当使用浮点小数来保存这个变量。当十进制小数与二进制浮点小数的转换不可避免,你又必须要求精度时,不应当使用浮点。

比方说 1.1 元钱,因为这个变量必须精确的等于十进制的 1.1,而变量本身是二进制,此时进制转换是必须的,所以你用浮点小数保存是错误的,你可以考虑用精确到分的 110 来表示这个数字,避免了小数。类似的,如果是计算器的话,如果用户是用十进制的格式输入,那么直接转换成二进制用计算机进行运算,最后再转换成十进制显示,这就不可避免的会有误差。

如果没有进制转换的需求,那么用浮点没有任何问题,甚至不会有精确性方面的问题

那么举一些可以用浮点数例子:

1,如果你有一个只需要在计算过程中出现的变量,它的输入并不来源于十进制小数,也不需要被转换成十进制保存,那么它完全可以用浮点,最典型的就是游戏,你需要使用一个很复杂的增伤减伤公式来计算出实际的伤害,而这个伤害直接的被作用到了目标,在整个过程中,所有的操作都使用二进制进行,不存在二进制十进制转换,因此就不会产生误差,此时用浮点根本没有问题。——当然在游戏中,即便其中的变量最终需要以十进制显示,你仍然可以用浮点,因为十进制显示虽然有误差,但可以四舍五入显示,不需要绝对精确。

2,如果你的浮点仅仅用来存储精度内的整数,那么使用它也不会存在问题。例如 64 位浮点可以用来精确存储 2^47 以内的整数,不会存在任何误差。换句话说就是 64 位浮点可以无损的放进一个 32 位的 int,不存在任何误差,在 32 位整数不够用,系统又不支持 64 位整数时,它也可以被当作 47 位的整数类型使用。(47这个数字有争议,有说48,52,53等等的,但不影响具体结论,都大于32,装32位整数依然可以完全精确表示。)

同理,32 位的浮点则可以精确的放进一个 2^23 以内的整数,不存在任何误差。 32 位浮点变量保存一个 16 位的 short 类型整数不产生任何误差,它也可以被当作一个精度在 23 bit 的整数类型。

3,可能存在的其他例子,欢迎补充。


--


补充,其实有一个不应该使用浮点的不常用场合,就是目标cpu没有浮点处理器,此时的浮点使用整数模拟计算出,效率极低。鉴于现代的绝大多数大多数CPU都配备了浮点处理器,浮点运算的性能跟整数是相当的。如果使用现代的cpu,需要避免浮点的情况发生概率很小。但在一二十年前,有很多cpu(尤其是嵌入式cpu)还没有配备浮点处理器,此时确实应该尽量避免,甚至完全避免用浮点。


user avatar   ling-jian-94 网友的相关建议: 
      

统计局工作人员也不过是公务员,没有受到过经济训练,所以他仅仅是给予统计,但是并没有解释能力。他所说的是“全员劳动生产率”我从来没有听说过,世界普遍通用所说的“劳动生产率”是单位时间内的产出,具体的说是每小时经济产出(output per hour worked)。

我们可以对比下这两个概念,统计局声称的“全员劳动生产生产率”是生产总增加值除以就业人口,意思为单位劳动力平均产出;普遍所用的“劳动生产率”是单位小时产出,所以实际上“全员劳动生产率”应该除以平均工时。由于中国人每年平均工作时间大概是2200小时,美国则为1750小时,所以实际上他的统计数据还要高估了,所以这个值应该为6%左右。由于我国处于后人口红利期,人口赡养比例较低,就业人口比例依旧高于平均水平。我国现在约有7.75亿人就业,而美国只有1.5亿人就业;同时我国就业人口工作时间都更长,分母更大的情况下分子就更小,所以实际上我国的劳动生产率和技术领先国家(美国)要比经济水平相对更低。

这个情况不仅仅出现在中国,在日本和韩国也是如此,普遍估计韩国的劳动生产率仅仅为美国的50.2%,日本则为65.4%。西班牙本身经济水平和韩国相近,但是工作时间远远少于韩国,实际上这意味着西班牙的劳动生产率远高于韩国,而根据OECD的估计西班牙的劳动生产率则为美国的74.5%。


即使如此,这个数据很明显是过分低估了中国的经济水平。理由有两个:

  1. 他使用的是2005年的美元计价,实际上应该调整到更接近现在的美元来计价(接近现价)。例如OECD使用的是2010年的不变价美元,一定程度上低估了韩国等新兴国家的经济水平,这一点 @Orz辉 所提到了。
  2. 汇率价值严重影响了测算,不管是韩国这种已经成为发达国家的新兴国家,还是波兰、土耳其等比较发达的新兴经济体,都面临着汇率被低估的问题。一定程度上来说,如果生产率的增长速度相当长时间保持和技术领先国家(如美国)相近的水平,那么用汇率计算的误差就小;而韩国、波兰、土耳其这些国家生产率快速追赶的国家则被低估。一个事实是波兰和土耳其如果用汇率计算的话,人均GDP则仅仅为10000美元,而实际上用购买力衡量则超过25000美元,所以OCED的统计表明,土耳其和波兰的生产率实际上和韩国相当,都超过了美国的50%,而不是仅仅为20%。所以实际上,统计局并没有考虑到每年76978元/人的实际价值是多少,而OECD的经济学家则使用的是PPPs。


一个可靠的方式是使用尽可能接近现价的不变价计算单位,并且使用购买力计算,例如OECD本身选择的是constant prices 2010 and PPPs。考虑到这两点我们做估算的话,中国的人均GDP按照购买力衡量现在大约美国的25%,中国的劳动生产率的可靠应该略高于美国的20%。所以,普遍的估计为中国的劳动生产率略微高于美国的劳动生产率的20%,一个比较精确的说法应该是21%。

从某种意义上,即使是21%的数字,中国的劳动生产率应该是被低估的。因为中国的经济规模应该大大高于现在已经测算的规模,在过去5年中国就已经更改了3次统计测量方式,每一次都提高了经济规模。即使如此,潜在的经济规模依旧存在,所以经济水平的低估意味着劳动生产率被低估了。

这种情况下,我们可以认为中国官方声称的劳动生产率增速远远高估了,因为中国政府高估了自己经济增长的速度。




  

相关话题

  如何评价StackOverflow有半数以上程序员为非科班出身? 
  《黑客帝国》中的先知是人还是程序? 
  ASP.NET MVC 如果全部用异步 Controller,会有什么效果?会成为高吞吐量,高并发的网站么? 
  .Net 新一代编译器 Roslyn 会带来怎样的影响? 
  如何才能写出没有bug的程序? 
  cmu 计算机的 bic 项目内部是什么样? 
  为什么操作系统没有前端和后端,而计算机很多其他领域却分前后端? 
  国外发达国家码农是真混得好么? 
  网游服务器逻辑和传输如何分层/解耦? 
  在北美(加拿大,美国)IT程序员是青春饭么? 

前一个讨论
以目前显卡科技发展的速度,什么时候能普及可以完美240HZ+运行4K画质大作的显卡?
下一个讨论
便秘吃华莱士哪款产品更容易喷射?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利