判断浮点型是否为整形,这样可以吗?

lau5301 2009-08-03 12:26:01
我在网上找了一下,网上的牛人都是用下面这样判断的,我自己也写也一个,好像很简单,似乎也可以判断,就是不知道有什么问题,请高手指教一下!!!!!!!!

bool DoubleIsInt(double n)
{
__int64 i, a=*(__int64*)&n, e=(a>>52&2047)-1023, t=a&0xFFFFFFFFFFFFFll;
if (n>=-1e-16F && n<=1e-16F) return true; //1e-16:判断是否为0时允许的误差
if (e<0) return false;
for (i=0x8000000000000ll; i; i>>=1)
if (i>>e&t) return false;
return true;
}

bool FloatIsInt(float n)
{
int i, a=*(int*)&n, e=(a>>23&255)-127, t=a&8388607;
if (n>=-1e-6F && n<=1e-6F) return true; //1e-6:判断是否为0时允许的误差
if (e<0) return false;
for (i=0x400000; i; i>>=1)
if (i>>e&t) return false;
return true;
}
///自己写的实现,高手指教
bool FloatIsInt(float n)
{
int k=(int)n;

if(n -k ==0 )
return true;
return false;
}
...全文
130 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
恩,同意。
定义的,和实际内存中的东西有可能是不一样的

[Quote=引用 1 楼 liao05050075 的回复:]
bool FloatIsInt(float n)
{
int k=(int)n;

if(n -k ==0 )
return true;
return false;
}

这个自然不行。

因为定义double a=3
结果保存到内存中,a有可能变成2.999999999999
于是结果就错了。
[/Quote]
liao05050075 2009-08-03
  • 打赏
  • 举报
回复
bool FloatIsInt(float n)
{
int k=(int)n;

if(n -k ==0 )
return true;
return false;
}

这个自然不行。

因为定义double a=3
结果保存到内存中,a有可能变成2.999999999999
于是结果就错了。
xiaotaoqibao 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liao05050075 的回复:]
bool FloatIsInt(float n)
{
int k=(int)n;

if(n -k ==0 )
return true;
return false;
}

这个自然不行。

因为定义double a=3
结果保存到内存中,a有可能变成2.999999999999
于是结果就错了。
[/Quote]
楼主抱歉,顶错个了
xiaotaoqibao 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 lau5301 的回复:]
我在网上找了一下,网上的牛人都是用下面这样判断的,我自己也写也一个,好像很简单,似乎也可以判断,就是不知道有什么问题,请高手指教一下!!!!!!!!

bool DoubleIsInt(double n)
{
    __int64 i, a=*(__int64*)&n, e=(a>>52&2047)-1023, t=a&0xFFFFFFFFFFFFFll;
    if (n>=-1e-16F && n <=1e-16F) return true; //1e-16:判断是否为0时允许的误差
    if (e <0) return false;
    for (i=0x8000000000000ll; i; i>>=1)
        if (i>>e&t) return false;
    return true;
}

bool FloatIsInt(float n)
{
    int i, a=*(int*)&n, e=(a>>23&255)-127, t=a&8388607;
    if (n>=-1e-6F && n <=1e-6F) return true; //1e-6:判断是否为0时允许的误差
    if (e <0) return false;
    for (i=0x400000; i; i>>=1)
        if (i>>e&t) return false;
    return true;
}
///自己写的实现,高手指教
bool FloatIsInt(float n)
{
int k=(int)n;

if(n -k ==0 )
return true;
return false;
}
[/Quote]
wanghao111 2009-08-03
  • 打赏
  • 举报
回复
数据在内存中的存放
支持下载,一、数据类型 常量是有数据类型的 变量必须声明其数据类型 (1)划分: 1.基本数据类型(四类八种) 数值型: 整数型:bute、short、int、long 浮点型:float、double 字符型:char 布尔型:boolean 2.引用数据类型:除基本数据类型外的所有都是基本数据类型 数值型: 类型 所占空间 取值范围 默认值 字节型 byte 1个字节(8位) -128—127 0 短整型 short 2个字节(16位) -32768—32767 0 整形 int 4个字节(32位) +-2(的31次方)约21亿 0 长整形 long 8个字节(64位) -2(的63次方)—2(的63次方)-1 0 浮点型: 单精度浮点型 float 4个字节(32位) 1.4013E-45—3.4028E+38 0.0F 双精度浮点型 double 8个字节(64位) 4.9E-324—1.7977E+308 0.0D 字符型: 字符型 char 2个字节(16位) 0—2(的16次方)-1 \u0000 布尔型: 布尔型 boolean 1个字节(8位) ture,false false (2)整形常量常用的三种表现形式: 1.二进制 2.八进制:八进制的数以0开头 3.十六进制:十六进制的以0x开头,0ffff:一个f代表4位 二、类型的转换 1.自动转换 2.强制转换 在一个表达式中,先把所有数转换成为级别最高的那个类型之后,再进行运算 byte,short,char 只要在表数范围中,不用强转可以直接进行赋值。但是要是超出范围,就必须要进行强转了 类型的优先级别:byte,short,char,int,long,float,double (低–高) 右>左–强制类型转换 右<左–自动转换 右=左–不用转 三、运算符: 算术运算符: +,-,*,/,%,++,– 赋值运算符:= 关系运算符: >,<,>=,<=,==,!= instanceof 逻辑运算符: &&,||,!,^ 位运算符: &,|,^,~ , >>,<<,>>> 条件运算符:?:(三目运算符) 扩展赋值运算符:+=,-=,*=,/= 1.算数运算符(+,-,*,/,%,++,–) (1) 两个int类型数据运算,结果是int类型 两个操作数中只要有一个是double类型,那么结果是double类型的数据 (2) “+”号的作用 1.表示正数 2.相加运算 3.字符串拼接 在单独运算的时候 ++i,i++ 没有任何区别,都是加1操作相当于 i=i+1 i++;先运算,后加1(先运算后加减) ++i;先加1,后运算(先加减后运算) 2.逻辑运算符(&&,||,!,^) 逻辑非 ! 取反 逻辑异或 ^ 操作数一样,结果为false;操作数不一样,结果为true 逻辑与 & 只要有一个操作数是false,那么结果就是false 短路与 && 短路与跟逻辑与 结果会一模一样。只要第一个操作数是false,那么结果一定是false,那么后面的那个操作数就不用计算了。提高了 效率。 逻辑或 | 只要有一个是true,那么结果就是true 短路或 || 短路或与逻辑或 结果一模一样。只要第一个操作数是true,那么第二个就不用计算,结果就是true。同样为了提高效率。 3.关系运算符(>,<,>=,<=,==,!=) ==:比较变量时是判断数值是否相等;比较引用变量时是判断两个在堆中的存储的地址是否相等 equals:操作时是判断两个变量是否是对同一对象的引用,即对堆中的内容进行比较 在比较引用变量时: ==判断的对象的地址 equals判断的是对象的内容 4.位运算符( &,|,^,~ , >>,<<,>>>) 在操作十进制数的时候首先转换为二进制的数进行操作 &:二进制都为1时为1,一个为0则为0 |:二进制都为0时为0,一个为1则为1 ^:二进制都为1时为0,一个为0则为1 ~:一个正数取~时,取反、减一、取反、加符号 一个负数取~时,直接取反

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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