CS:APP上的一道题

RiderOnStorm 2006-08-22 03:05:57
Homework Problem 2.56:
Fill in the return value for the following procedure that tests whether its first argument is greater than or equal to its second. Assume the function f2u returns an unsigned 32-bit number having the same bit representation as its floating-point argument. You can assume that neither argument is NaN. The two flavors of zero: +0 and -0 are considered equal.

int float_ge(float x, float y)
{
unsigned ux = f2u(x);
unsigned uy = f2u(y);

/* Get the sign bits */
unsigned sx = ux >> 31;
unsigned sy = uy >> 31;

/* Give an expression using only ux, uy, sx, and sy */
return /* ... */ ;
}
...全文
404 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
RiderOnStorm 2006-08-24
  • 打赏
  • 举报
回复
>>阶码的表示是实际值+128

更正一下,是127。更确切的说是2^k-1 - 1,这里k=8。阶码为全0时,实际值为1-127=-126
tailzhou 2006-08-24
  • 打赏
  • 举报
回复
float的-0.0的bit是 10000000000000000000000000000000;
float的+0.0的bit是 00000000000000000000000000000000;

因为阶码在尾数的前面,并且阶码的表示是实际值+128,阶码-128的bit是00000000,阶码0的bit是10000000;
所以确实不用分开阶码跟尾数,可以一起来比较。
crazy_lazy_pig 2006-08-24
  • 打赏
  • 举报
回复
呵呵,我确实没测试过,手头没有编译器啊。
尾巴的两个问题也提的很正确。

不过我很是怀疑,什么时候会出现负0?题目是否本身就有问题?
crazy_lazy_pig 2006-08-23
  • 打赏
  • 举报
回复
return( ~(sx > sy || ((ux < uy) ^ sx)));
tailzhou 2006-08-23
  • 打赏
  • 举报
回复
return ( (!(ux<<sx) && !(uy<<sy)) || (sx<sy) || (sx==sy && ((ux >= uy) ^ sx)) )



tailzhou 2006-08-23
  • 打赏
  • 举报
回复
楼上的可能有些问题;
阶码也是有符号的。
大耳 2006-08-23
  • 打赏
  • 举报
回复
比较野蛮的一种方法:

return ( \
(sx>sy) || \
((sx == sy) && (ux&FIELD_P) > (uy&FIELD_P)) || \
((sx == sy) && (ux&FIELD_P) == (uy&FIELD_P)) && (sx * (ux&FIELD_S - uy&FILED_S))) \
)?1:0;

FIELD_P ,FIELD_S分别是阶码和尾数的位域掩码
poiu_poiu 2006-08-23
  • 打赏
  • 举报
回复
jf
tailzhou 2006-08-23
  • 打赏
  • 举报
回复
return( !(sx > sy || ((ux < uy) ^ sx)));
也肯定是不对的。

当第一个是正数,第二个是负数的时候,结果不对;



RiderOnStorm 2006-08-23
  • 打赏
  • 举报
回复
yangxudongseu和tailzhou(尾巴),你们这样的答案属于裸奔一级的;-)
硬搞肯定可以搞定,但我相信有更简洁的答案。
RiderOnStorm 2006-08-23
  • 打赏
  • 举报
回复
crazy_lazy_pig(疯狂懒猪)的答案貌似正确,目前发现两个问题:

1. 最外面那个~应该改成!吧,要不然变成按位取反。
2. x=-0,y=+0的case过不了。
tailzhou 2006-08-23
  • 打赏
  • 举报
回复
楼上的测试过没,好象有问题的;

休正了一下yangxudongseu的:
#define FIELD_P 0x7fffff
#define FIELD_S 0x7f800000

return ( (sx<sy) || ((sx == sy) && (sx^((ux&FIELD_P) > (uy&FIELD_P)))) || ((sx == sy) && (ux&FIELD_P) == (uy&FIELD_P) && (sx ^ ((ux&FIELD_S) > (uy&FIELD_S)))) )?1:0;
RiderOnStorm 2006-08-22
  • 打赏
  • 举报
回复
>>如果要通过分析float的存储方式(1 8 23)来判断,好象不是那么容易用一个表达式写出来;

但似乎这正是出题者的意思,他在期待一个简洁的答案,其中用到了sx和sy。
tailzhou 2006-08-22
  • 打赏
  • 举报
回复
如果要通过分析float的存储方式(1 8 23)来判断,好象不是那么容易用一个表达式写出来;
tailzhou 2006-08-22
  • 打赏
  • 举报
回复
题目没说不能用类型转换;

return ( *((float *)&ux)>=*((float *)&uy) ? 1 : 0 );


deppew123 2006-08-22
  • 打赏
  • 举报
回复
mark

69,369

社区成员

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

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