梓酥 2020-04-02 12:44 采纳率: 0%
浏览 336

计算机系统浮点数题目

2.92. 遵循位级浮点编码规则,实现具有如下原型的函数:
/* Compute –f. If f is NaN, then return f. */
float_bits float_negate(float_bits f);
对于浮点数 f,这个函数计算- f 。如果 f 是 NaN,你的函数应该简单的返回 f。
测试你的函数,对参数 f 可以取的所有 2
32个值求值,将结果与你使用机器的浮
点运算得到的结果相比较

我的代码是这样的

#include<stdio.h>
typedef unsigned float_bits;
float_bits float_negate(float_bits f);
int main()
{
    float_bits x,y;
    scanf("%x",&x);
    y=float_negate(x);
    float f=*((float*)&y);
    printf("%f\n",f);
}
float_bits float_negate(float_bits f)
{   
    unsigned s=f>>31;
    unsigned exp=f>>23&0xff;
    unsigned frac=f&0x7fffff;
    if((exp==0xff)&&frac)#if it is NaN
    return f;
    else 
    return (~(s<<31))|(exp<<23)|frac;#other=negative f
}

在32位linux机器运行结果不对

图片说明

请问是什么原因以及应该如何修正呢?

  • 写回答

1条回答 默认 最新

  • y_m_h 2023-07-22 20:18
    关注

    float_negate中的return ((s<<31))|(exp<<23)|frac;有问题,(s<<31)中的按位取反,(s<<31)中的低31位全为1。所以,return (~(s<<31))|(exp<<23)|frac;应改为return (((s?0:1)<<31))|(exp<<23)|frac;

    评论

报告相同问题?

悬赏问题

  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算