打印
[牛人杂谈]

关于float类型。。。

[复制链接]
1003|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wahahaheihei|  楼主 | 2016-9-11 22:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个float 变量赋值为3.1 时, 为什么printf 输出的值为3.0999999 ?
大多数电脑都是用二进制来表示浮点和整数的。在十进制里, 0.1 是个简单、
精确的小数, 但是用二进制表示起来却是个循环小数0.0001100110011 . . . 。所以
3.1 在十进制内可以准确地表达, 而在二进制下不能。
    在对一些二进制中无法精确表示的小数进行赋值或读入再输出时, 也就是从
十进制转成二进制再转回十进制, 你会观察到数值的不一致. 这是由于编译器二进
制/十进制转换例程的精确度引起的, 这些例程也用在printf 中。参见问题14.6。

沙发
huangcunxiake| | 2016-9-12 09:20 | 只看该作者
这个就是内部存储结构了,内部都是二进制存储,如果用存数字的方式存,那肯定会四舍五入。。。

使用特权

评论回复
板凳
dongnanxibei| | 2016-9-12 10:04 | 只看该作者
好像是这么回事,有时候一个数据经过几次换换后,就变味儿了。

使用特权

评论回复
地板
wahahaheihei|  楼主 | 2016-9-18 18:57 | 只看该作者
使用 FLOAT ( precision ) 数据类型创建列时,保证所有平台上的列至少按指定的最小精度保存值。相比之下,REAL 和 DOUBLE 不能保证与平台无关的最小精度。
如果未提供 precision,FLOAT 数据类型将是单精度浮点数(等同于 REAL 数据类型),需要 4 个存储字节。
如果提供了 precision,则 FLOAT 数据类型将是单精度或双精度型,具体取决于所指定的精度值。REAL 和 DOUBLE 之间的分界值与平台相关。单精度 FLOAT 值需要 4 个存储字节,而双精度 FLOAT 值则需要 8 个存储字节。
FLOAT 数据类型是一种近似数字数据类型。它在算术运算后容易产生舍入误差。FLOAT 值的近似特性意味着在比较 FLOAT 值时通常应该避免使用等式的查询。

使用特权

评论回复
5
dongnanxibei| | 2016-9-18 23:47 | 只看该作者
我理解中的,
1:浮点数:+/-mantissa * 2^exponent.这是754里的定义
2:float占4字节,32位,其中1位表示符号,8位表示指数exponent(实际要减去127),23位表示底数.

那么根据我的计算,浮点数a=m * 2^e

m底数23位,可以表示2^23个数.
e指数8位,可以表示0-255,为了表示负数,实际是-127到128.

所以,
范围应该是,最小,-2^23 * 2^-127,到最大2^23 * 2^128

结果是,我错了。
洗个澡回来,希望有人指导错在哪里

使用特权

评论回复
6
稳稳の幸福| | 2016-9-19 11:12 | 只看该作者
这个关系到内部的存储方式。

使用特权

评论回复
7
捉虫天师| | 2016-9-19 14:43 | 只看该作者
不同的类型直接转换比较麻烦,这个是C语言严谨的地方。其他语言有的不需要定义类型。

使用特权

评论回复
8
wahahaheihei|  楼主 | 2016-9-19 21:23 | 只看该作者
一般在计算时候可以忽略的,输出时候使用精确度控制就行

使用特权

评论回复
9
598330983| | 2016-9-19 22:47 | 只看该作者
在十进制里, 0.1 是个简单、 精确的小数, 但是用二进制表示起来却是个循环小数0.0001100110011 .

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

217

主题

3063

帖子

12

粉丝