float数据类型中一些问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题一:
(32位机)int和float型数据在内存中同为4字节,为什么float型数据比int型数据表示的范围大得多?(见tab1)
类型 字节数 有效数字 数字范围
Int 4 -32768~32767 即-2^15~(2^15-1)
Long 4 -2147483648~2147483647即-2^31~(2^31-1)Float 4 7 -3.4×10^(-38)~3.4×10^(38)
Double 8 16 -1.7×10^(-308)~1.7×10^(308)
Tab1
答案:(它们在内存中存放数据的方式不同)
Int型数据在内存中是以精确值来存储的,每个数都与32bit中的各个bit 是一一对应的。比如3就是0X0003。
Float型将4byte的内存划分为符号位,指数位,尾数位(fig1)。尾数位决定了精度,指数位增大了广度。比如1.123123*10^34,这个数中的1.123123就放在尾数位,阶数10^34就放在指数位。这个数虽然表示范围大,但是有效位不高,也可以说精度不高,因为1123123?????,在3以后的数都无法精确表示。也就是说float牺牲了精度,提升了广度。
Fig1
C语言中浮点数(即实数)是以科学计数法(只有一位非零整数)来计数的(即规划化指数形式,例如1.2356E6)。如图fig1所示,23位尾数就是表示十
进制规范化尾数(1.2356),8位指数位(-128~127)来表示指数(E6),因此转换成十进制为2^(-128)-2^(127),因此高达10^38。但是23位尾数(1.2356)限制了其精度,23位尾数转成十进制2^23=8388608,因此其有效位最高只有7位,多了就不是有效的了。
问题二:
VC++6.0中关于float型变量的赋值、输出、类型转换。
Note:实型常量即使没有小数部分,也一定要带有小数点“.”,比如4.0或4.都是浮点型,但4是整型。
答案:
① 用printf和scanf进行格式输入输出时,输出列表的数据类型必须和格式说
明相同,否者会错误,这里没有数据类型自动转化。(cout、cin并没有格式说明,但同样默认输出6位小数)fig2
Fig2
②赋值类型转化,当整型数据赋给浮点型变量时,数字不发生变化,但有效位增
加;当浮点型数据赋给整型变量时,浮点数小数部分将被舍弃。Fig3
③浮点数的有效位和默认输出,由于尾数的限制,float型只接受7位有效数字,
double只接受16位有效数字,多给无效。(多给不是四舍五入而是直接丢弃)
VC++6.0默认输出6位小数,采取四舍五入的方式。fig4
多给无效,随机数
Fig4
由于浮点型数据有效位的限制,会导致计算机的舍入误差。当一个大数加小数时,
即使小数不是真的小,也会导致舍入误差,就是大数吃小数。Fig5
小数部分几乎全被舍去
Fig5
④int型转换成float型,由原来的10位整数变成的只有7位有效数字,精度丢失,但输的范围扩大了(tab1)。在某些可能产生大数的地方可以这样转换,否者用int型会产生溢出错误,而毕竟(1/10^7)精度还是可以接受,为达到更高精度,可以转换成double型,(在VC++6.0和matlab中,默认实数都是double 型的。)fig6、fig7.
Fig6
Fig7