作者LPH66 ((short)(-15074))
看板C_and_CPP
标题Re: [问题] 浮点数的残值
时间Thu Nov 12 15:33:01 2009
※ 引述《TIME1987 (把握当下)》之铭言:
: 遇到的问题:float与double在位数上的不同
: #include <stdio.h>
: int main()
: {
: float num1=123.456789012345;
: double num2=123.456789012345;
: printf("num1=%16.12f\n",num1);
: printf("num2=%16.12f",num2);
: return 0;
: }
: 程式跑出来的结果:num1=123.456787109375
: num2=123.456789012345
: 开发平台:codeblock
: float只能容纳4个位元组 所以是8个位数的精度
: 但为何num1=123.456787109375从第8位之後的数字会是这麽不规律呢?
: 书上说是记忆体的残值 但这个残值是怎麽出来的呢?
: 谢谢~
其实不是残值
是被切掉的二进位所代表的误差值
例如 0.123 好了 它的二进位是 0.00011111011111001110110110010001011...
\_____ 这里一共24位 ____/
如果我只要二进位小数有效位数24位
(和 float 一样; 为何不是23位是标准表示法有藏一个1没有纪录)
那麽就会变成 0.0001111101111100111011011001
精确转回十进位是 0.1229999996721744537353515625
注意到二进位的24位约等於十进位的 24log2=7.22 位
所以切在有效位数是 0.1230000 的确达到了位数
後面那些乱七八糟的数字就是在那之後被切掉的数字所代表的误差值而已
也就是说 十进位七位以後的数字都不准 能相信的就是七位精确而已
--
'Oh, Harry, dont't you
see?' Hermione breathed. 'If she could have done
one thing to make
absolutely sure that every single person in this school
will read your interview, it was
banning it!'
---'Harry Potter and the order of the phoenix', P513
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.28.92
※ 编辑: LPH66 来自: 140.112.28.92 (11/12 15:34)
1F:推 TIME1987:谢谢你~ 11/12 15:34
2F:推 VictorTom:小弟我一直以为是六位精确, log2 * mentisa bit数Orz 11/12 16:58
3F:推 lairrol:7位没错!!这个我试过....当要比较两个浮点数发现的=.=" 11/12 19:19
4F:→ lairrol:不过第七位有时候也会有误差就是了 xx.xxx1 和 xx.xxx0 囧 11/12 19:20
5F:→ LoveCheer:高手 11/12 20:01
6F:推 VictorTom:3F~~第七位有时会有误差, 那就是六位精确而已啊?_? 11/12 20:29
7F:→ LPH66:咦等等我发现我多算一位 float 的 mantissa 是 23 bit 11/13 02:12
8F:→ LPH66:不过这样改也是7.2...应该还不会少到剩六位 11/13 02:13
9F:→ LPH66:三楼可能是你有一位整数的关系... 11/13 02:13
※ 编辑: LPH66 来自: 140.112.28.92 (11/13 02:15)
10F:→ LPH66:7位是有效位数喔 不是小数位数..所以有1位整数时小数就剩6位 11/13 02:16
11F:推 lairrol:我自己try的例子是 1.xxxxxx1 0.xxxxxx0 会这样... 11/13 03:23
12F:→ lairrol:嗯~LPH说的应该没错~我试完是整数位1位+小数位6位精确 11/13 03:23
13F:推 VictorTom:对喔~~我忘记了整数的那一位....Orz 11/13 08:34
14F:推 photon3108:23bits 会有正规化之後,变成可表达24bits的关系吗?, 11/13 12:26
15F:推 photon3108:gcc, vc 都定义 FLT_DIG <cfloat> 是 6,怎麽少1个 11/13 12:32