奇怪的浮点数问题!

potency 2003-12-14 10:59:20
#include <stdio.h>
void main()
{
double doub=1230.12345678901234567890123;
float flo1=1234.1;//567890123456
float flo2=0;
int a;
scanf("%d",&a);

printf("doub:%f\na:%d",doub,a);
//scanf("%f",&flo1);
printf("flo1:%12.9f\n",&flo1);
scanf("%f",&flo2);
printf("flo2:%f\n",&flo2);
scanf("%f",&flo2); /**pause */


}

/*
* 上面程序的结果出乎令人意料,整数a能够正确输入,也能正常打印出来。
* 但是后面的flo1和flo2为什么就不能正确输入,输出呢!
渐愧!!!
疑问:
1: 为什么flo1,不能正确输入和显示呢?有时输入了,打印出来时还是初始值!有时干脆打印出 0.00000000000
2:更有时候:根本就跳过scanf,不让我输入,奇怪!难道是buffer出了什么问题?
3: 如果我想输入double型的数,不知道怎么用语句来实现输入????
4:最后我想问一个问题:如果我想在结果后面保留小数点后面30位以上,,不知道如何实现~!!多谢!!用于科计算! 电子能量等!!

头疼!奇怪!谢谢大家!!
chendiy@sohu.com
*/

...全文
64 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
dislimit 2003-12-16
  • 打赏
  • 举报
回复
1.初学者在写完一个程序时,一定要检查printf()和scanf()中的输出变量序列是否少了或多了'&',不然会出现意想不到的错误。

2。一定要检查格式控制符是否与输出表列匹配。如:double型的要用“%lf”。

3。我在windows平台下使用TC时,曾经遇到过不可思议的浮点错误,这是TC2。0的一个bug,所以建议使用高版本的编译器。

4。关于精度问题,建议使用科学计数法。这样就避免了位数不够的问题。如果真的需要这么多小数(个人认为即使是科学家也很少这么用),可以使用多个double型进行数据分段保存(具体方法由于时间关系,就不列举了)。要用的时候把他们拼起来便是。
liushuaiboy 2003-12-16
  • 打赏
  • 举报
回复
帮你顶
晨星 2003-12-16
  • 打赏
  • 举报
回复
“真的非常奇怪!!用%f 输入double时,printf出来后已经不是刚才输入的数了!”
这很正常,因为并不是每个10进制的有限小数都能用二进制的有限小数表示的,你输入的是10进制表示,而机器里的是二进制表示,所以很可能有出入。
不信,你自己手工试一下用二进制表示0.3,这个只有一位有效数字的10进制小数,看能否能用有限的二进制小数表示?
potency 2003-12-16
  • 打赏
  • 举报
回复
float 还是输入不进去!!!
谢谢大家
yjh1982 2003-12-16
  • 打赏
  • 举报
回复
#include <stdio.h>
int main()
{
double doub=1230.12345678901234567890123;
float flo1=1234.1;//567890123456
float flo2=0;
int a;
scanf("%d",&a);

printf("doub:%f\na:%d",doub,a);
scanf("%f",&flo1);
printf("flo1:%12.9f\n",flo1);
scanf("%f",&flo2);
printf("flo2:%f\n",flo2);
scanf("%f",&flo2); /**pause */

return 0;
}
////////程序正常!第一次输入一个整数,不要输入11.1之类
potency 2003-12-16
  • 打赏
  • 举报
回复
: Caoyu015(酷鱼一代) :你上面的方法仍然不行!!!也就是加了fflush 还是不行!!
flo1,flo2 根本还是输入不进去@!!!!
输入后打印出来还是:0.000000000
急急!!!!

我用的是VC6.0
VC7.0也用了!!

dislimit(风飘雪影) :谢谢但是问题1,2,3,4还是没有得到很好的解决!!!!!!
zhangfjj 2003-12-15
  • 打赏
  • 举报
回复
steedhorse(晨星)是个好同志!^_^
potency 2003-12-15
  • 打赏
  • 举报
回复
<h3>谢谢, Caoyu015(酷鱼一代),ryyy(弱弱的幸福生活) </h3>
<font color=blue size=6>
有时候一个scanf还要输入两下才能过,不知道是怎么回事!
关于提高精度小数点后30位的问题还是没有解决!我还要回去试一下!!
</font>
Caoyu015 2003-12-15
  • 打赏
  • 举报
回复
#include <stdio.h>
void main()
{
double doub=1230.12345678901234567890123;
float flo1=1234.1;//567890123456
float flo2=0;
int a;
fflush( stdin ); //每次从标准输入端口读的时候加入。
scanf("%d",&a);

printf("doub:%f\na:%d",doub,a);
//scanf("%f",&flo1);
printf("flo1:%12.9f\n",&flo1);
fflush( stdin );
scanf("%f",&flo2);
printf("flo2:%f\n",&flo2);
fflush( stdin );
scanf("%f",&flo2); /**pause */
fflush( stdin );

}
021850524 2003-12-15
  • 打赏
  • 举报
回复
输出double要%lf
ryyy 2003-12-15
  • 打赏
  • 举报
回复
另外输入浮点数的时候是不可能完全和你输入的时候一样的,vc里double和float有64位,虽然这已经能表示很精确的小数了,但是30位以后的似乎不可能完全精确表示吧。
ryyy 2003-12-15
  • 打赏
  • 举报
回复
那样不会跳过输入!
ryyy 2003-12-15
  • 打赏
  • 举报
回复
连续的scanf的时候,需要清空其缓冲区,否则会出现你说的那些问题,常见的用fflush(stdin) 或者getchar()把其回车符略去。
potency 2003-12-15
  • 打赏
  • 举报
回复
steedhorse(晨星):谢谢!!
哦,我昨天改了一下,没有注意到在printf
时用&,当然这是打错了!!
1: 前面注销的那个为输入flo1!!后面的flo2不是为了输入,只不过是为了在机器停一下,我好看结果!!
2:真的非常奇怪!!用%f 输入double时,printf出来后已经不是刚才输入的数了!
2.1 比如说,我要输入六个double 数据,scanf和cin>>都试了!总只能输入几个!总有一两 个跳过!!整数是没有这样的问题!!
4:long float 和double有17个有效位!!听说好像有可能的!!

晨星 2003-12-14
  • 打赏
  • 举报
回复
1。仔细看看,你根本没有scanf一次flo1,你两次scanf的都是flo2。:)还有,printf时干吗还要取变量的地址?“&flo1”?
2。不知道。
3。VC中,"%f"就是输入double。
4。不可能,double类型的有效数字只有16位。即使输出了,从第17位之后的也都是不准确的。如果一定要输出,只能自己定义数据结构来保存浮点数了。
potency 2003-12-14
  • 打赏
  • 举报
回复
最近一老教授要我帮忙把其在apple机上的程序用C语言来实现!!
他的机器是Apple2,计算他的东西,(电子能量等)实现22阶梯距阵要好几个小时才会出结果!!
老人家85岁了半夜起来输入然后早晨起来还没有算完呢!!!
Apple2 能不慢吗?

70,014

社区成员

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

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