为什么浮点数强制转换成整形会发生错误

zjtzlqr 2013-02-19 09:36:59
#include "stdio.h"
int main(void)
{
float a;
int b;
a=222222222;
b=(int)a;
printf("%d",b);
}


int类型的范围不是 (-2147483648到2147483647)吗

输出结果为什么会是222222224。
...全文
1356 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-02-21
  • 打赏
  • 举报
回复
引用 21 楼 sdchenchen2012 的回复:
引用 19 楼 zhang20072844 的回复:引用 18 楼 sdchenchen2012 的回复:引用 17 楼 zhao4zhong1 的回复:C/C++ code?12 float a; a=222222222;犯了两个错误 一.float最多容纳6位10进制有效数字 二.float常量需要加后缀f 纠正后: C/C++ code?1 a=2.2222……
请将“有效数字”的概念复习一下
sdchenchen2012 2013-02-21
  • 打赏
  • 举报
回复
引用 23 楼 zhao4zhong1 的回复:
引用 21 楼 sdchenchen2012 的回复:引用 19 楼 zhang20072844 的回复:引用 18 楼 sdchenchen2012 的回复:引用 17 楼 zhao4zhong1 的回复:C/C++ code?12 float a; a=222222222;犯了两个错误 一.float最多容纳6位10进制有效数字 二.float常量需要加后缀f ……
我已经复习了,特地百度搜了这个概念,发个概念给你: 有效数字:对于一个科学计数法的数字,从左边第一个不是0的数字起,到精确到的位数止,所有的数字都叫做这个数的有效数字。 1.xxxxxx (23个xxx) * 2^e(e是阶码-127) 这就是单精度浮点数的定义 ,你怎么能说 单精度只能容纳 2^23个数字呢, 没看到*阶码后, 数字会变的更多了吗
赵4老师 2013-02-20
  • 打赏
  • 举报
回复
 float a;
 a=222222222;
犯了两个错误 一.float最多容纳6位10进制有效数字 二.float常量需要加后缀f 纠正后:
 a=2.22222+e8f;
wizard_tiger 2013-02-20
  • 打赏
  • 举报
回复
改用double应该就没有问题了。
sdchenchen2012 2013-02-20
  • 打赏
  • 举报
回复
引用 19 楼 zhang20072844 的回复:
引用 18 楼 sdchenchen2012 的回复:引用 17 楼 zhao4zhong1 的回复:C/C++ code?12 float a; a=222222222;犯了两个错误 一.float最多容纳6位10进制有效数字 二.float常量需要加后缀f 纠正后: C/C++ code?1 a=2.22222+e8f; 为什么只能是6位10进制 ……
1.xxxxxx (23个xxx) * 2^e(e是阶码-127) 这就是单精度浮点数的定义 ,你怎么能说 单精度只能容纳 2^23个数字呢, 没看到*阶码后, 数字会变的更多了吗
dingqiang107 2013-02-20
  • 打赏
  • 举报
回复
编译器没警告吗?
AndyZhang 2013-02-20
  • 打赏
  • 举报
回复
引用 18 楼 sdchenchen2012 的回复:
引用 17 楼 zhao4zhong1 的回复:C/C++ code?12 float a; a=222222222;犯了两个错误 一.float最多容纳6位10进制有效数字 二.float常量需要加后缀f 纠正后: C/C++ code?1 a=2.22222+e8f; 为什么只能是6位10进制 我看了标准了,不知道这个6是怎么计算出来的
IEEE754标准 求23位2进制数能容纳多少位10进制数? 即求2的23次方约等于10的几次方, 即计算以10为底(2的23次方)的对数 即6
sdchenchen2012 2013-02-20
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
C/C++ code?12 float a; a=222222222;犯了两个错误 一.float最多容纳6位10进制有效数字 二.float常量需要加后缀f 纠正后: C/C++ code?1 a=2.22222+e8f;
为什么只能是6位10进制 我看了标准了,不知道这个6是怎么计算出来的
wzuxian2012 2013-02-19
  • 打赏
  • 举报
回复
引用 10 楼 ForestDB 的回复:
float的有效位数没有那么多。 将a定义成double。
引用 8 楼 sfd1234 的回复:
6楼的回答很完整啊!
引用 1 楼 zmlovelx 的回复:
存放格式不一样的。 如果不解可搜索浮点的二进制表示。
由于float型在存储时省去了整数位1,因此float型的存储空间里所能保存的浮点数信息应为23+1=24位,也就是说最大是2^24=16777216可以用float型保存与表示,也就是8位十进制数字,但由于所有8位十进制数字不能完全表示,于是最高保证整数精度就是7位。 "也就是说最大是2^24=16777216可以用float型保存与表示" 这怎么理解? 1.xxxx xxxx xxxx xxxx xxxx xxx * 2^n 阶码n的最大值是127 ,最小值是-126 怎么根据推出 2的24次方来?最大值不该是1.1111 1111 1111 1111 1111 111的 *2^27 吗?
qq120848369 2013-02-19
  • 打赏
  • 举报
回复
浮点数已经越界了。。
ForestDB 2013-02-19
  • 打赏
  • 举报
回复
float的有效位数没有那么多。 将a定义成double。
wzuxian2012 2013-02-19
  • 打赏
  • 举报
回复
引用 6 楼 zwjchina 的回复:
float的精度是由尾数的位数来决定的。float只有23位是表示数的,其他位用来表示数的符号以及阶码 float:2^23 = 8388608,一共七位数字,这意味着最多能有7位有效数字,但绝对能保证的为6位 222222222有9个有效数字,因此用float表示会丢失精度,因此,要保证9个有效数字不丢失精度,你必须 使用double 而不是float.……
谁说是七位是这样计算的? float的格式:1.xxx * 2^n次 xxx就是尾数。 xxxx的最大数自然全是23个1。 第二:有效数字也不是这样计算的, 有效数字的定义: 一个近似数据的有效位数是该数中有效数字的个数,指从该数左方第一个非零数字算起到最末一个数字(包括零)的个数,它不取决于小数点的位置 按照这个定义: 二进制的最大效数字(float)则是: 1+23=24.(1是1.xxxx中的最左边的1)
sfd1234 2013-02-19
  • 打赏
  • 举报
回复
6楼的回答很完整啊!
我在地球 2013-02-19
  • 打赏
  • 举报
回复
#include "stdio.h" int main(void) { float a; int b; a=222222222.0f; //这样呢? b=(int)a; printf("%d",b); }
zwjchina 2013-02-19
  • 打赏
  • 举报
回复 1
float的精度是由尾数的位数来决定的。float只有23位是表示数的,其他位用来表示数的符号以及阶码 float:2^23 = 8388608,一共七位数字,这意味着最多能有7位有效数字,但绝对能保证的为6位 222222222有9个有效数字,因此用float表示会丢失精度,因此,要保证9个有效数字不丢失精度,你必须 使用double 而不是float. double有52位尾数,可表示15-16位有效数字。
七擒关羽 2013-02-19
  • 打赏
  • 举报
回复
在一定范围内转换是一致的,你查看下,自己写算法
七擒关羽 2013-02-19
  • 打赏
  • 举报
回复
确实是存储会不同,类型转换是按照实际的二进制存储值进行的
zjtzlqr 2013-02-19
  • 打赏
  • 举报
回复
引用 1 楼 zmlovelx 的回复:
存放格式不一样的。 如果不解可搜索浮点的二进制表示。
但是,如何才能解决这个问题呢,现在需要把浮点类型转换成整形
漫步者、 2013-02-19
  • 打赏
  • 举报
回复
引用 楼主 zjtzlqr 的回复:
本帖最后由 zjtzlqr 于 2013-02-19 09:38:56 编辑 C/C++ code?123456789#include "stdio.h"int main(void){ float a; int b; a=222222222; b=(int)a; printf("%d",b);} ……
浮点的格式不一样,你看下他的那个标准
帅得不敢出门 2013-02-19
  • 打赏
  • 举报
回复
存放格式不一样的。 如果不解可搜索浮点的二进制表示。
加载更多回复(4)

70,011

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧