我看书发现这里想不通,好像也没有找到相应的解释。求教,大一新生一枚。

类似问题

能不能用double去取代float?

http://www.zhihu.com/question/66347905?utm_source=com.miui.notesutm_medium=social (分享自知乎网)


我觉得这个问题完全是重复啊

能不能用double去取代float??

www.zhihu.com图标

这个问题下已经有大量优秀回答,现在再问一次有什么意义?

但是既然重定向被撤销了……(不at了,但真想问问为什么要撤销?)


先说我的看法:你需要什么就用什么,但是不要想著让别人也跟著用什么。

如果我只是想在中间过程中保留小数的存在用于最后舍去,那我需要double的精度吗?

如果我要进行科学计算,double精度都不够,那问题是不是要改成「long double精度比double高,为什么不用double」?

C语言有float和double,最主要当然是历史原因,当年比较广泛的是float——当年浮点运算都是作为开销大的一种存在。

至于写代码的人为什么用float而不是double,那就得问作者本身了,但最通常的原因就是用不上和惯性——既然float的代码也是正常在跑,为什么要换成double?

就算是现在,我认为也不该取消float——硬体上没取消,作为接近硬体层的C/C++也就不该也不可能取消。

不取消了不意味著必须用float,但同样这也不意味著必须用double。知道自己需求,知道float/double的区别(包括概念上的,硬体上的),才是最重要的。

「xxx更好更轻松,为什么不去用xxx」。「更好更轻松」都是有代价的,只不过的确日常很多时候不重要罢了。


如果想知道更多float/double硬体上的区别,那个回答有很多优秀答案:

能不能用double去取代float??

www.zhihu.com图标能不能用double去取代float??

www.zhihu.com图标能不能用double去取代float??

www.zhihu.com图标


因为空间很宝贵,包括内存和磁碟以及网路流量等等。

一个 double 占用的空间是一个 float 的 2 倍。当数据量足够大的时候,翻一翻可是相当可观的。在精度允许的情况下,我们总是使用更节省空间的 float。甚至在特定领域,还会使用更小的浮点类型。例如,在 GPU 编程上 half 类型就很常见,作为比 float 还小一半的浮点类型,它在你能看到的所有游戏大作中发光发热。虽然精度与 double 不可同日而语,但应用在像素著色上,人眼根本无法分辨那极其微小的亮度变化。

所以,适用才是硬道理。

https://en.m.wikipedia.org/wiki/Half-precision_floating-point_format?

en.m.wikipedia.org

Minifloat - Wikipedia?

en.m.wikipedia.org图标


绝大多数情况下不会去用float。但是呢,在某些特定场景,比如你对计算结果的精度要求不高,而内存紧张的情况下,是可以用float的,毕竟float只占4位元组,double占8位元组。

至于你看到书上用float,据我的经验,这些写书的老古董都是从上古时代过来的,在他们那个内存没这么大的时代,用float节省内存是正常的。


这不就是「何不食肉糜」么,没过过节约内存和兼容cpu的日子。

double精度高的同时,内存占用也是double的。


内存啊内存啊啊啊!!!普通程序没问题,但如果竞赛的时候限制死256M内存,而你的DP不能滚,对精度要求又不高的时候开double才是有病吧


其他回答说了内存问题。我提另一个原因。例如你在调用GPU进行运算,单精度和双精度对于特定GPU的算力完全不同。有些GPU阉割了双精度,会导致效率奇低。

如果是做3D实时渲染的话,你不能保证做项目的时候,你可以用最新的图形api,如果gpu就是有些地方不让你用双精度,除了干瞅著还能怎么。

而且用得到双精度的地方实在不多,颜色数值一般没必要这么高,很多时候16位就够了。

光栅化过程深度值勉强需要,但是如果真的是很大的场景,何不用logz呢,很大又有很多遮盖的场景……盗梦空间游戏版?星球大战的死星?这种场合太少见了。


推荐阅读:
相关文章