float数据类型中一些问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档