首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求个算法,怎么判断浮点数是否是整数

2012-03-06 
求个算法,如何判断浮点数是否是整数如题,比如4.0是整数,而4.2是小数小弟先谢了~~[解决办法]不知道这个行不

求个算法,如何判断浮点数是否是整数
如题,比如4.0是整数,而4.2是小数
小弟先谢了~~

[解决办法]
不知道这个行不行
void pot()
{
int x;
float y,z;
scanf( "%f ",&y);
x=y;
z=y-x;
if z==0
printf( "整数 ");
else
printf( "小数 ");
}
[解决办法]
判断浮点数是否等于零不能直接用==吧

const int Error= 0.00000001
void pot()
{
int x;
float y,z;
scanf( "%f ",&y);
x=y;
z=y-x;
if (z> Error&& z <Error)
printf( "整数 ");
else
printf( "小数 ");
}
[解决办法]
如题,比如4.0是整数,而4.2是小数
小弟先谢了~
----------------------------
这个简单:

const double delta = 1e-5;

if (float_data - int(float_data) < delta )/* 浮点数总有一些舍入误差, 这样写是为了进行更准确的判断 */
[解决办法]
main()
{
float f;
scanf( "%f ", &f);
if(f - int(f) <= 1e-5)
{
printf( "是整數 ");
}
else
printf( "不是整數 ");
}
[解决办法]
给出一个不用计算的方法(不是用任何浮点运算 ),速度很快。


#include "stdafx.h "
typedef unsigned short WORD;
typedef unsigned __int64 UINT64;

/*
一个double型浮点数包括8个字节(64bit),我们把最低位记作bit0,最高位记作bit63,
则一个浮点数各个部分定义为:
第一部分尾数:bit0至bit51,共计52bit,
第二部分阶码:bit52-bit62,共计11bit,
第三部分符号位:bit63,0:表示正数,1表示负数。
如一个数为0.xxxx * 2^ exp,则exp表示指数部分,范围为-1023到1024,
实际存储时采用移码的表示法,即将exp的值加上0x3ff,使其变为一个0到2047范围内的一个值。

判断一个数是否整数,可采用如下规则:
1. 如果一个数的绝对值小于1,则这个数的阶码小于零,则这个数为小数,
2. 如果一个数的绝对值> =2^52,应视为这个数为整数
3. 如果一个数x 1 <=x <2^52 且阶码为e, 则:
这个数的尾数部分,只有前e bit 可以出现 '1 ',剩下的52-e比特全部为0,
如此,则只要判断剩下的 52-e bit是否为0 即可
下面给出程序
*/


int isInt(double a)
{
WORD *pWord=(WORD *)(&a)+3;
short exp = ( (*pWord & 0x7fff) > > 4 )-0x3ff; //取得阶码

if ( exp <0 ) //a <1
return 0;
else if ( exp> =52) //a> =2^52
return 1;
else
{
UINT64 n= *((UINT64 *)(&a));
n < <=12;
return (n < < exp)==0;
}

}
int main(int argc, char* argv[])
{
double f1,f2,f3,f4,f5,f6,f7;

f1=0.5;
f2=1.0;
f3=1.1;
f4=1024.0;
f5=1024.5;
f6=2251799813685248.0;
f7=2251799813685248.5;
printf( "isInt(%f)= %d\n ",f1,isInt(f1));
printf( "isInt(%f)= %d\n ",f2,isInt(f2));
printf( "isInt(%f)= %d\n ",f3,isInt(f3));
printf( "isInt(%f)= %d\n ",f4,isInt(f4));
printf( "isInt(%f)= %d\n ",f5,isInt(f5));
printf( "isInt(%f)= %d\n ",f6,isInt(f6));
printf( "isInt(%f)= %d\n ",f7,isInt(f7));

return 0;
}

热点排行