打印

计算一个浮点数的整数位数和小数位数,结果是这样,Why?

[复制链接]
3442|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主




代码很简单,真心搞不懂!

#include <iostream.h>
#include<math.h>
/******计算浮点数n的小数位数j和整数位数h,显示出来******/
void main()
{
   int j=0, k=0,i,h=0,
   float p;
   float n;
   cout <<"please input a float numbers:\n";
   cin >> n ;
   
   for (i=0,p=8;n!=p;i++)
     {
  k=n*(pow(10,i));
  p=k/(pow(10,i));
  j++;
  }
   for (i=0;k!=0;i++)
  {
  k=n/(pow(10,i));
  h++;
  }
        h=h-1;
  j=j-1;
   cout <<"整数部分位数 " <<h <<"\n";
   cout <<"小数部分位数 " <<j <<"\n";
}

相关帖子

沙发
keer_zu| | 2015-1-14 13:31 | 只看该作者
使用调试工具进入循环体跟一下不就明白了。

使用特权

评论回复
板凳
qinchang|  楼主 | 2015-1-14 23:35 | 只看该作者
yyy71cj 发表于 2015-1-14 18:15
我觉得这个应该是浮点数在计算机中的表示问题。

一般来说,浮点数在计算机中都很难准确表示,都是逼近表示 ...

用VC跑程序,求浮点变量的1000倍,当这个浮点变量有小数位时,直接卡死了。

使用特权

评论回复
地板
qinchang|  楼主 | 2015-1-14 23:43 | 只看该作者
本帖最后由 qinchang 于 2015-1-14 23:47 编辑

看来要换个思路,数字用一个整形和一个指数的形式表示更好处理,显示函数也简单了很多!

使用特权

评论回复
5
forrest11| | 2015-1-15 00:57 | 只看该作者
这种计算小数位数的算法很不好。
而且,你肯定9.999×1000 =  9999? 实数大小判断不是这样的哦,一般是abs(a-b)<=1e-7........

使用特权

评论回复
6
keer_zu| | 2015-1-16 13:27 | 只看该作者
这里面一开始就有不确定的地方:

输入的地方,如果你 输入9.9999999999给n,  n得到的值很可能是10.0。
切莫说上面算法是否正确。


问题说白了还是两个:

1.浮点数表示范围是多少?超出这个范围的如何处理,比如超出部分是直接舍掉还是别的方法。
2.尽量不要用cin这样的调用,直接赋值(这也要看C语言的标准是怎么处理的)
3.浮点数是如何表示的,这是问题的本质。

根据浮点数的表示方法,很容易得到小数点后面二进制数的位数,将它转成10进制判断一下,这算是直观的方法吧,或许有点复杂,但不会错。

使用特权

评论回复
7
keer_zu| | 2015-2-13 13:41 | 只看该作者
问题解决了吗?

使用特权

评论回复
8
qinchang|  楼主 | 2015-2-14 21:59 | 只看该作者
keer_zu 发表于 2015-2-13 13:41
问题解决了吗?

这个其实是在一个测试电阻电容电路中用的,一个共用的显示输出函数,因为电容最小能到pF级,电阻最大能到GΩ级,范围跨度很大,所以采用国际单位制计数法显示。考虑到浮点数不好处理,已换了思路------往显示函数送两个数字,一个为基数,一个为指数。这样只显示基数部分,然后根据指数大小确定小数点位置和结尾的单位制字母,如"K“,"M“等。
所以,电阻和电容测试函数输出两个结果--------一个基数,一个指数。这个里面需要用到指针。

使用特权

评论回复
9
keer_zu| | 2015-2-17 16:06 | 只看该作者
qinchang 发表于 2015-2-14 21:59
这个其实是在一个测试电阻电容电路中用的,一个共用的显示输出函数,因为电容最小能到pF级,电阻最大能到 ...

:D

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

151

帖子

1

粉丝