c 语言里浮点相乘 为什么小数全为0了

hollandjzy 2010-05-17 01:22:25
如题:c 语言里浮点相乘 为什么小数全为0了
float x=8266.206055;
float y=7226.922363;
float z;

z=x*y;

z=59739228.000000;

为什么得到的Z 小数点后面全为0了
...全文
1825 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fx397993401 2010-05-17
  • 打赏
  • 举报
回复
用double 即可
旭子 2010-05-17
  • 打赏
  • 举报
回复
float 浮点类型相乘会造成下溢
wibnmo 2010-05-17
  • 打赏
  • 举报
回复
学习。。帮顶。。
zhangzhongke007 2010-05-17
  • 打赏
  • 举报
回复
若若的学习了!
冻结 2010-05-17
  • 打赏
  • 举报
回复
发现 float 在C++版火了!
满眼都是 float !
zenny_chen 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 itegel84 的回复:]
FLT_MAX = 3.4028234663852886e+038
实际上没有超出float范围。只是float只有6位有效位。因此无法正确表示。double标准规定是需要多于10为有效位的,而windows和linux应该都是15位。因此改成double就没有这个问题了。

下面是调试结果:
x 8266.21
y 7226.92
z 5.97392e+007
[/Quote]
嗯,你说的没错,确实是有效位的问题,呵呵。
单精度浮点z若用十六进制表示的话就是:4C63E317
也就是:2^25 * (1 + 2^(-1) + 2^(-2) + 2^(-7) + 2^(-8) + ... + 2^(-23))
itegel84 2010-05-17
  • 打赏
  • 举报
回复
FLT_MAX = 3.4028234663852886e+038
实际上没有超出float范围。只是float只有6位有效位。因此无法正确表示。double标准规定是需要多于10为有效位的,而windows和linux应该都是15位。因此改成double就没有这个问题了。

下面是调试结果:
x 8266.21
y 7226.92
z 5.97392e+007
Henry8484 2010-05-17
  • 打赏
  • 举报
回复
LS都分析的对,把float修改成double就不存在这样的问题了
bobo364 2010-05-17
  • 打赏
  • 举报
回复
C 标准要求 float 类型至少要能精确表示到小数点后6位。float 一般是 32 位的。
C 标准规定 double 类型至少要能精确到小数点后 10 位。double 通常是 64 位的。

估计是超出float的精度范围了
zenny_chen 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hollandjzy 的回复:]
改为double 没什么变化的
[/Quote]


#include <stdio.h>

int main(void)
{
double x=8266.206055;
double y=7226.922363;
double z;

z = x * y;

printf("%.15g\r\n", z);
}
RHuniSoft 2010-05-17
  • 打赏
  • 举报
回复
超出了float能表示的精度范围了,就是double也一样超出精度范围,方法:现成的没有,你可以自己写个更大进位制的表示数字的进位制,比方说10^9进位制,我同学写过一个,可以存无限位,后者直接下个大数计算器,算一下好了
zenny_chen 2010-05-17
  • 打赏
  • 举报
回复
由于对于单精度浮点数而言,其所能表示的精度已经到顶了,所以这里可以用double,双精度浮点来表示精度更高的数。
zenny_chen 2010-05-17
  • 打赏
  • 举报
回复
呵呵,楼主可以添加下面代码查看结果:

printf("%.8X\r\n", *(int*)&z);

其实主要还是输出格式问题。这里应该以指数形式输出。
hollandjzy 2010-05-17
  • 打赏
  • 举报
回复
改为double 没什么变化的
wb_chn 2010-05-17
  • 打赏
  • 举报
回复
float -> double呢?
hollandjzy 2010-05-17
  • 打赏
  • 举报
回复
麻烦有人知道的告诉下 是什么原因引起,应该怎么解决
zenny_chen 2010-05-17
  • 打赏
  • 举报
回复
呵呵,超出浮点能表示范围了。

70,037

社区成员

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

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