网站管理手册,怎么搭建网站友情链接,网站域名续费怎么续费,企业名称核准在开始阅读本文之前#xff0c;请猜测一下下面程序的输出结果#xff1a;float a0.0f;for(int i0;i10;i){a0.1;}couttrue? Youre too young, too simple, sometimes naive.虽然乍看上去很不可思议#xff0c;但是0.1叠加10遍的确是和1.0不等的。这种诡异的情况是由…在开始阅读本文之前请猜测一下下面程序的输出结果float a0.0f;for(int i0;i10;i){a0.1;}couttrue? Youre too young, too simple, sometimes naive.虽然乍看上去很不可思议但是0.1叠加10遍的确是和1.0不等的。这种诡异的情况是由于浮点数的计算误差引起的。既然是扫盲贴我就稍微罗嗦一点先从浮点数的格式讲起吧。在IEEE标准中浮点数是由符号位(1 bit)指数位(8 bits of float and 11 bits of double)以及精度位(23 bits of float and 52bits of double)组成的。不放假设符号位是sym指数位是exp精度位是pre那么一个浮点数的值就等于(sym1? - : ) 1.pre * 2^(exp-2^k)。其中k指数位的位数-1即是说k7 of float, k10 of double。举个例子1 10000001 11010010001000000000000表示一个float number它的值是-1.11010010001000000000000*2^(129-2^7) -1.11010010001000000000000*2。但是2进制的浮点数表示有一个很大的问题——它并不可以精确表示所有实数。说得更准确一点只有可以写成2^a2^b2^c...这种形式并且精度不能太多的实数才可以用浮点数来精确表示。而大多数实数仅仅保存了一个四舍五入后的近似值而已。譬如0.1在单精度浮点数中实际值为0.100000001490116119384765625。正是这种非精确的表示形式造成了浮点数运算的误差。不管加减乘除只要涉及到了浮点数你都得心里清楚结果不是精确值只是近似罢了。所以在浮点数的运算中请尽量避免用比较结果可以用 ab顺带提一下0和无穷大在浮点数中是可以精确表示的IEEE规定除了符号位外全0表示0除符号位全1表示正负无穷。好吧把话题扯回来。由于浮点数运算有误差浮点数的四则运算不具备结合律和分配率。看一个wiki上的例子a 1234.567, b 45.67834, c 0.0004(a b) c:1234.567 (a) 45.67834 (b)____________1280.24534 rounds to 1280.2451280.245 (a b) 0.0004 (c)____________1280.2454 rounds to 1280.245 a (b c):45.67834 (b) 0.0004 (c)____________45.6787445.67874 (b c) 1234.567 (a)____________1280.24574 rounds to 1280.246 另一个例子1234.567 × 3.333333 4115.2231.234567 × 3.333333 4.1152234115.223 4.115223 4119.338but1234.567 1.234567 1235.8021235.802 × 3.333333 4119.340总结懒得写。非要说点什么的话谢谢大家捧场^_^