不调用标准库函数,如何得到double类型数据各位的值?

freezingfire 2002-12-17 03:11:21
现有一个double类型变量dSrc,想得到其各位的值,例如,100,得到1,0,0。

如果是int类型,使用%,很简单。但是double类型不支持。

只能采用将dSrc除以10的商,取整,再乘以10,与原来的dSrc相减,得到个位这样的算法。

对于double的取整,可以采用库函数floor(),但是现在不允许使用库函数,请问在这种情况下该如何取整?

或者有别的更好的方法来得到double各位的值?

谢谢!
...全文
55 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
rtdb 2002-12-18
  • 打赏
  • 举报
回复
double的取整:

double f;
int nValue = int(f+0.5) ;
MadLee 2002-12-18
  • 打赏
  • 举报
回复
如果f不是太大的话,直接转换成int不就行了?
double f = 234.56;
int n = f;
然后就用你说的方法。
freezingfire 2002-12-18
  • 打赏
  • 举报
回复
对不起,可能我原来没有说清楚,是得到十进制各位的值,

例如十进制的123,得到1,2,3,不是得到二进制各位的值,对不起!

begincsdn(begincsdn)那么辛苦的写出了程序,虽然不是我想要的,还是非常感谢!
俞庆平 2002-12-18
  • 打赏
  • 举报
回复
因为double型不支持很多的位操作,
所以强制转型为char来处理,
这样就可以进行位操作了。
因为表示位串习惯的关系,以及在计算机中表示的关系,
循环设定的初始值从高位向低位走。
实际的 double 的字节序为:
[7][6][5][4][3][2][1][0]
在每个字节中的位序
[76543210]
在seed >> =1 时先取得的是每个字节的[0]位,再[1]。一直到[7]
而存放它们时,我从数组的低位向高位存放,所以用了pos来表示
所以在数组中我存放的位序列为[0...63]
[7][01234567][6][01234567].....[0][01234567]
输出时,用表示习惯:
[0][76543210][1][76543210][2]....[7][76543210]
这样就形成了,上面三种有点难以理解的循环,待优化。



mengzq 2002-12-18
  • 打赏
  • 举报
回复
用memcpy,把double copy到一个char的数组中,然后满满处理,呵
俞庆平 2002-12-18
  • 打赏
  • 举报
回复
#include <iostream.h>

struct BITS
{
unsigned bit:1;
};
int main(int argc,char * argv[])
{
long size = sizeof(double);
BITS * dbbits = new BITS[size * 8];
char * p;
int seed = 1;
double test;
cin >> test;
while(test > 0.001 || test < -0.001)
{//取零退出循环
p = (char *)&test;

for(int pos = 0,i = size -1; i >= 0;i--)
{
seed = p[i];
for(int j = 7; j >= 0 ; j--,pos++)
{
dbbits[pos].bit = (0x01&seed)?1:0;
seed>>=1;
}
}
for( int i = size * 8 - 1;i >= 0 ; i--)
{
if(i%8 == 7) cout <<" ";
cout << dbbits[i].bit;
}
cout << endl;
cin >> test;
}
}
freezingfire 2002-12-18
  • 打赏
  • 举报
回复
To:zhaohangcom(赵)

不能使用库函数。

To:xzhuang(胖头鱼)
移出来之后呢?谭浩强的书我正在查,可是还没找到:P
freezingfire 2002-12-18
  • 打赏
  • 举报
回复
多谢各位热心,虽然没有得到答案。
SwordMan2001 2002-12-18
  • 打赏
  • 举报
回复
用sprintf可能会得到很多多余的0,用C++的 strstream 好了:

double f;
ostrstream ostr;
ostr<<f;
//之后,用ostr.str() 可以得到字符串值,而ostr.pcount() 可以得到字符个数,再处理应该很容易。
earthharp 2002-12-18
  • 打赏
  • 举报
回复
sprintf
然后自己取出来。
ckacka 2002-12-18
  • 打赏
  • 举报
回复
我有一个比较简单的思路就是用字符串把这个float的变量存储起来,然后就可以很容易的得到每一位(十进制)的数值。

即使要转换成真正的float变量也不难实现:
对于任何一个位(十进制)上的数字,只有十种可能性(0~9),你通过一个swicth语句就可以想一个float的变量里面添加了,比如个位就直接添加,十分位就乘以0.1,其余类推。
xzhuang 2002-12-17
  • 打赏
  • 举报
回复
用位运算。
比如:移位把它移出来。不过应该有更好的方法。谭浩强的书上就有。
zhaohangcom 2002-12-17
  • 打赏
  • 举报
回复
这个在C++函数库中有将double 变成字符一位一位存入 数组中的函数
你要有全一点C++函数库的 书 查一下吧
johnny_jiang 2002-12-17
  • 打赏
  • 举报
回复
建议嵌套ASM语句!!
具体方法,我暂时没有,但是我相信这样会简单点。
freezingfire 2002-12-17
  • 打赏
  • 举报
回复
不明白,能详细解释一下吗?
virginsoldier 2002-12-17
  • 打赏
  • 举报
回复
数据结构就是这样了,就看你怎么处理了!哈哈!:)
freezingfire 2002-12-17
  • 打赏
  • 举报
回复
double是8个字节吧?

另外,考虑到Windows和Unix的字节顺序问题,这样好像不行吧?
litsnake1 2002-12-17
  • 打赏
  • 举报
回复
up
virginsoldier 2002-12-17
  • 打赏
  • 举报
回复
struct BYTE
{
unsigned h:1;
unsigned g:1;
unsigned f:1;
unsigned e:1;
unsigned d:1;
unsigned c:1;
unsigned b:1;
unsigned a:1;
};

union
{
double var;
struct BYTE byte[4];
}

69,373

社区成员

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

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