关于float精度
用vc6.0编译c++程序,调用limits输出float取值范围为1.17549乘10的-38次到3.40282乘10的38次。。。代码如下。。std<<std::numeric_limits<float>::min()<<std::endl;std<<std::numeric_limits<float>::max()<<std::endl;
但根椐IEEE,如果按规格化计算则与上方范围一致,但不是还有非规格化的数(无默认的1,且阶码为0)吗?最小正数应为2的-126次方乘2的-23次方即2的-149次方。为何编译器不承认这个值呢?{:9_237:} 因为c标准并不要求机器使用IEEE浮点标准。根本点说是综合考虑效率和精度问题,为了效率省去必要的精度。(我的理解)
早期的浮点数只有规格化浮点数,1985年后,IEEE标准754里规定了非规格化浮点数(深入理解计算机系统一书说的),这时intel为了对8087处理器的设计而资助的一项研究的成果。
非规格化浮点数的精度更高,但代价是需要额外的机器开销。据说sse2就会直接把非规格化浮点数视为0.也据说使用非规格化浮点数比只使用规格化浮点数在极端情况下效率会下降百倍一上。
所以我认为是为了效率,c默认只使用规格化浮点数。
但我查找网络资料,见到一个函数调用。
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV);
函数作用是设置浮点数环境,调用这个参数用是强制系统不使用非规格化浮点数。但我没有找到强制使用的参数的宏是什么,或者说也不知道有没有这个参数。
这个函数是在<cfenv>(旧的是<fenv.h>)库中,很遗憾,我的vs2010没有这个库,网上也没找到下的,所以也无法查看库文件里对这个函数的参数的宏定义。
楼主自己感兴趣的话,找到这个库文件自己研究下吧。 float 分数值位和精度位的。 不懂啊,可不可以讲得细一点。。 @ryxcaixia @小甲鱼 @无名侠 @wzy997991067 @向往青莲 快来帮帮忙{:10_266:} ,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。 夜礼服 发表于 2016-3-29 15:50
@ryxcaixia @小甲鱼 @无名侠 @wzy997991067 @向往青莲 快来帮帮忙
{:5_91:}
页:
[1]