返回信息流为什么这个float值和2000加就是正确的值。和4000相加的时候就是四舍五入了。我试了一下,与5*x相加的数,从大于等于2044开始就出现问题了。
这是一条镜像帖。来源:北邮人论坛 / cpp / #100374同步于 2020/10/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
c语言中float和整数相加问题
saber154
2020/10/19镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我试了下两个浮点数会这样,但是我不太清楚的是两个位数相同的整数2000,4000,他们转化为float也是小数点后面都是0,但在与float型的这个数5*x相加时会有不同的结果呢。
【 在 specops 的大作中提到: 】
: 精度不够
: PS:试一下0.1+0.2
我B站视频自学的,在我印象中小数的存储是很复杂的,不是精确的存储。
https://sandtower.blog.csdn.net/article/details/104688114?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
谢谢兄弟,看了这个文章及其传送门,我知道了是怎么丢失精度的,并且是如何进行二进制运算的,然后再转化为十进制。float型运算比较有可能出现精度错误,但是具体这个问题上,我猜或许是2044比较接近2048会在2的10次方基础上多一位,导致一些错误什么的吧。仔细研究的话,还得详细用它的计算模式走一遍
【 在 DukeGmw 的大作中提到: 】
: 我B站视频自学的,在我印象中小数的存储是很复杂的,不是精确的存储。
: https://sandtower.blog.csdn.net/article/details/104688114?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
楼主可以尝试把想要研究的浮点数的内存表达形式打印出来,比如
char *a = (char *)&j;
然后用a[0]到a[3]去访问它
把一个整数用二进制的形式输出的代码这里就省略了
我试了下打印内存是这样的,可以把这地址转化为2进制是吧
【 在 plazum 的大作中提到: 】
: 楼主可以尝试把想要研究的浮点数的内存表达形式打印出来,比如
: char *a = (char *)&j;
: 然后用a[0]到a[3]去访问它
: ...................
不是把地址转换成二进制,而是查看浮点数的二进制表达形式
不过我又发现我上面那个方法有点多此一举了,实际上可以直接赋值给一个unsigned int,就像这样
unsigned a = *(unsigned *)&j;
然后用二进制输出a
for (int i = 31; i >= 0; i--)
printf("%d", (a >> i) % 2);
【 在 saber154 (saber) 的大作中提到: 】
: 我试了下打印内存是这样的,可以把这地址转化为2进制是吧[upload=1][/upload][upload=2][/upload]
我试了下输出全是0
【 在 plazum 的大作中提到: 】
: 不是把地址转换成二进制,而是查看浮点数的二进制表达形式
: 不过我又发现我上面那个方法有点多此一举了,实际上可以直接赋值给一个unsigned int,就像这样
: unsigned a = *(unsigned *)&j;
: ...................