这问题是个好问题,虽然无解——因为这已经是最优解了………
造成这个问题的原因主要是:提高精度对bit的占用太厉害了。
例如说float,一共才32bit,就已经拿了23bit出来表示精度了,只可惜2^23只有7位10进制精度。
好,按照题主要求,我们增加一位10进制精度,那我们就需要27bit(2^27=134217728,刚好覆盖完8位10进制)。但这多出来的4bit从哪来?只能是指数部分了吧?指数少了4bit,覆盖范围就由现在的2^(2^7)=2^128=10^38,急剧缩减为2^(2^3)=2^8=256。如果你到这还看不懂的话,那我再提醒你:而浮点数规定小数点左边只能补一个1,也就是说,这时按照你的“新式float标准”,连个1000都表达不出来……
总而言之,你太小看了指数的增长速度了。尤其在浮点数的设计里,范围的变动影响还是2阶指数的。所以虽然你看着不起眼,但只要你随便拿走几个bit,原来看着近乎天文数字的表示范围,一下子就沦落到连买部手机的价钱都表示不出来了。
最多最多,就稍微微调一下,多拿一个bit给数值,让float可以完整的表示7位10进制精度:2^23=8388608,而2^24=16777216,这也许会用着爽一些。至于范围嘛,虽然开了个方,但好歹还是有10^19的范围,起码亿亿级别的数字还是够用的。
最后我想吐槽一下,是谁加上“c++”这个标签的?
虽然float确实是c/c++的类型,但c/c++的编译器无非是用浮点指令去操作它而已,实际精度和范围展示本质上是cpu/gpu决定的。
至于cpu和ieee754之间,当初是谁先这么定的,到底是鸡生蛋还是蛋生鸡,那就看谁有功夫去考究一把了。
“大坐标对象时产生的抖动问题”?
坐标多大?
如果用float记录一座城市,单位用“米”,城市半径算5000米的话,外围区域误差多少?
5000=2的12次方,23位float尾数乘上12次方,那小数点后面也能剩下11位
误差范围大概是“1/2000”米,也就是0.5“mm”,怎么就不够用了?
“Z-fighting”?
这能怪float吗?
你把顶点数据换成double,z-fighting照样发生
这个问题根本就不是float造成的,而是z-buffer位宽只有24bit造成的
那么,“z-buffer位宽为什么只有24bit”呢?
别问我
问nVidia黄仁勋先生
问AMD桑德斯先生和现任CEO苏姿丰女士
GPU是他们设计的
我觉得是你压根儿没搞明白啥叫作浮点数,你要精度高直接用整型不就行了么?全精度的……
不需要,我已经几乎两年没用过有线充电了。
把常用场合都部署好无线充电以后,真的不用操心换手机换充电器之类的事情。
其实很简单的一个问题:取消耳机口之后,各位是改用L口耳机C口耳机,还是改用无线耳机?我曾经以为会普及L口或者C口耳机,然而现实就是无线耳机开始普及。
无线充电座普及之后,由于它没有插拔,所以她的寿命其实远比手机要长。
--
所以,如果你没有无线充,强烈建议你尝试无线充。