win32程序浮点数据精度问题
2013-08-16 15:19
239 查看
浮点数显示问题
问题描述:在本地系统中定义了一个float变量,并赋一个很大值,但程序运行结果与原始值不一致。如下测试程序:
程序运行后输出结果为:123456790528.0
分析了浮点数在内存中的表示方式后发现是float的精度问题。
32位浮点数的二进制表示方式为:R = S * M*2E-127
E为实际的指数加上固定值127。
数值123456789012转换为二进制为:1110010111110100110010001101000010100
共37位,那么小数点左移36位后为
1. 110010111110100110010001101000010100,由于32位浮点数尾数为23位,那么只能保留小数点后前23位,即:1.11001011111010011001000,后面12位数根据大小进行四舍五入,比如这里的1101000010100转换后为6676大于213-1,那么向前进1,最终存储表示为:1.11001011111010011001001,阶码为36+127=163。
也就是经过转换后精度有丢失,转换后的数据为:1.110010111110100110010010000000000000,去掉小数点后,即为计算机存储的数据大小,值为123456790528。
结论:如果使用float定义,当数据大于16777215(24个二进制的1,111111111111111111111111)后,就会出现精度问题,与原始数据的差距范围取决于该数据的二进制表示中总位数与24的差值,比如这里是37,那么范围为0-237-24
问题描述:在本地系统中定义了一个float变量,并赋一个很大值,但程序运行结果与原始值不一致。如下测试程序:
int main(int argc, char* argv[]) { float fvalue = 123456789012.0; float *p = &fvalue; printf("%f\n", fvalue); TRACE("\r\n val=%f", fvalue); return 0; } |
分析了浮点数在内存中的表示方式后发现是float的精度问题。
32位浮点数的二进制表示方式为:R = S * M*2E-127
E为实际的指数加上固定值127。
符号位—1bit | 阶码E—8bit | 尾数M—23bit |
1 | 1111 1111 | 111 1111 1111 1111 1111 1111 |
数值123456789012转换为二进制为:1110010111110100110010001101000010100
共37位,那么小数点左移36位后为
1. 110010111110100110010001101000010100,由于32位浮点数尾数为23位,那么只能保留小数点后前23位,即:1.11001011111010011001000,后面12位数根据大小进行四舍五入,比如这里的1101000010100转换后为6676大于213-1,那么向前进1,最终存储表示为:1.11001011111010011001001,阶码为36+127=163。
也就是经过转换后精度有丢失,转换后的数据为:1.110010111110100110010010000000000000,去掉小数点后,即为计算机存储的数据大小,值为123456790528。
结论:如果使用float定义,当数据大于16777215(24个二进制的1,111111111111111111111111)后,就会出现精度问题,与原始数据的差距范围取决于该数据的二进制表示中总位数与24的差值,比如这里是37,那么范围为0-237-24
相关文章推荐
- 解决excel解析浮点类型数据精度问题
- 微信小程序,请求php后台返回json数据多出隐藏字符问题
- js浮点数精度问题(js计算中遇到的坑)
- 关于数据精度的问题
- Java 各数据类型计算的精度问题
- C++ 数据类型及相关问题 及输出精度控制
- win8 应用商店程序 --数据绑定 遇到的问题
- JDBC插入Timestamp类型数据时精度问题
- 【Java】解决计算浮点数精度问题(BigDecimal)
- Matlab常见问题之 浮点数精度问题
- C++ Primer 学习笔记:浮点数精度问题
- 【解码】浮点数精度问题 | 为什么(int)(32.3 x 100) = 3229?
- 运行部署在Weblogic上的Web应用时,过一段时间程序就提示数据连接断了,重起Weblogic就好了。过一段时间又出现同样的问题。
- win7+vs2010+Qt addin新建win32控制台程序编译出错问题
- java浮点运算精度问题的解决
- Linux下的一个简单汇编程序, .long声明数据的长度问题!
- 调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题
- linux下Java程序插入DB数据中文乱码问题
- 程序调用查询数据存储过程的问题
- struts2标签处理double数据类型 精度缺失问题