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

请教x是float类型,什么情况下x!=x为真

2012-02-29 
请问x是float类型,什么情况下x!x为真请问x是float类型,什么情况下x!x为真?x,y分别是int和unsignedint时

请问x是float类型,什么情况下x!=x为真
请问x是float类型,什么情况下x!=x为真?  
x,y分别是int和unsigned   int时
什么时候((x> 0)&&(y> 0)&&(x+y <x))   为真?
谢谢!

[解决办法]
#include <iostream>
using namespace std;

int main()
{
int nan = -1;
float x = (float&)nan;
cout < < boolalpha < < (x!=x) < < endl; // output "true "
}

[解决办法]
x,y分别是int和unsigned int时
什么时候((x> 0)&&(y> 0)&&(x+y <x)) 为真?

当 y> int 极值,小于 unsigned int 极值时候,
就是 y 的最高位为 1 的时候,
满足该条件。
[解决办法]
up 星辰

#include <iostream>
using namespace std;

int main()
{
int x = 1;
unsigned int y = -1;

cout < < boolalpha < < ((x> 0)&&(y> 0)&&(x+y <x)) < < endl; // output "true "
}

[解决办法]
第二题,
应该是当 x+y> unsigned int极值的情况下:

比如:
int x=0x1234;
unsigned int y=0xffffffff;
[解决办法]
呵呵, UP 周星星 ^_^

由于 隐式的类型转换规则,
x+y 的类型是 unsigned int,
要使得 x+y <x ,只要使得数据溢出即可 ~
[解决办法]
#include <stdio.h>
int main()
{
float x=(float)1e-3;
x=x+1;
if(x!=x)
printf( "x is unequal to x ");
else
printf( "x is equal to x!\n ");

}
[解决办法]
float 和 double

都不要用 == 或者 != 比较。

还讨论。。。?
[解决办法]
呵呵,学习了,
NAN数还可以这样得到:
float zero=0;
float x=0/zero;
原先一直以为/0溢出呢。
[解决办法]
对于floating point,有两种比较方法:(摘自CS:APP)

an ordered comparison used for comparisons such as < and <=, and an unordered comparison used for equality comparisons. The two comparisons differ only in their treatment of NaN values, since there is no relative ordering between NaN’s and other values.
For example, if variable x is a NaN and variable y is some other value, then both expressions x < y and x > = y should yield 0.

从上文可以看出,如果是NaN与其他数的有序比较,则x < y 和 x > =y 都为0;文中没有确切说明NaN的无序比较问题,不过从实际运行来看,也只有NaN可以使 x != x为1了。

对于float数据, NaN即指数8位全部为1,而尾数23位非全0的情形。(尾数全0是无穷大)

所以,下面的测试程序将输出1(true): (小端机器)

int main( )
{
float x;
char* p = (char *)(&x);
p[0] = 0x1; // p[0]为1是为了使尾数不全为0,如果改为0程序将输出0
p[1] = 0x0;
p[2] = 0x80;
p[3] = 0x7f; // 0x7f + 0x80使指数8 bit为全1

cout < < (x != x) < < endl;
}

[解决办法]
X+Y溢出时阿,上边不是早有人回答你了啊
[解决办法]
int x,y时,((x> 0)&&(y> 0)&&(x+y <x))什么时候为真?
unsigned int x,y时,((x> 0)&&(y> 0)&&(x+y <x))什么时候为真?
------------------------
int的情形: y的取值范围为:[INT_MAX - x + 1, INT_MAX]


unsigned int 的情形:y的取值范围为:[UINT_MAX - x + 1, UINT_MAX]

热点排行
Bad Request.