计算机系统基础实验 - 同符号浮点数加法运算/无符号定点数乘法运算的机器级表示

news2025/1/13 2:32:31

实验3 同符号浮点数加法运算/无符号定点数乘法运算的机器级表示

实验序号:3 实验名称:同符号浮点数加法运算/无符号定点数乘法运算的机器级表示
适用专业:软件工程 学 时 数:2学时

一、实验目的

1.掌握定点数乘法溢出的判定方法。
2.掌握浮点数加法的基本运算法则。
3.掌握浮点数规格化方法。

二、实验要求

按照实验题目的要求,编写程序并上机调试

三、实验设备、环境

计算机、Windows 7 、Visual C++ 6.0

四、实验步骤及内容

1.编写浮点数加法器:
设在main中有如下数组:

char float1[33];
char float2[33];

编写函数

float addfloat(char float1[],char float2[],int m,int n);

输出浮点数加法结果,在函数内部要求有保护位和舍入位并通过这两位判定是否舍入。
2.编写无符号整数乘法运算器:

char int1[5];
char int2[5];

编写函数

unsigned mul(char int1[],char int2[],int m,int n);

在运算结束后,将高4位保存在int1中,低4位保存在int2中,返回是否溢出。
提示:
1.乘法运算要求必须编写乘法器,不可以将二进制串先转换为十进制,做乘法运算后再转换为二进制。
2.浮点数加法器应当分为几个函数来写:计算阶码exponent,尾数右移shift,无符号整数加法器add。
3.浮点数加法器的总过程是对阶、尾数相加、右规、舍入
4.注意到尾数共有23位,舍入需要加2位,隐藏的1需要加1位,加法运算有可能进1再加1位,因此尾数用一个27位的数组来表示会大大简化计算难度。

五、讨论、思考题

1、为什么要用浮点数加法运算最多只会右规一次?

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>

void removeBlank(char *str) {
    char *tmp = str;
    int i, j = 0;
    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] != ' ')
            tmp[j++] = str[i];
    }
    tmp[j] = '\0';
    str = tmp;
}

int exponent(int *exponent_ptr) {
    int i = 0;
    int res = 0;
    for (i = 0;i < 8;i ++ )
        res += pow(2, i) * exponent_ptr[i];
    res -= 127;
    return res;
}

int* add(int *arr_1, int *arr_2, int *flag)
{
    int i = 0;
    int *res = (int *)malloc(100),*result = (int *)malloc(100),*handle_arr_1 = (int *)malloc(100),*handle_arr_2 = (int *)malloc(100);
    memset(handle_arr_2, 0, 100);
    memset(res, 0, 100); memset(handle_arr_1, 0, 100);
    for (i = 0;i < 23;i ++ ) {
        handle_arr_1[22 - i] = arr_1[i];
        handle_arr_2[22 - i] = arr_2[i];
    }
    for (i = 0;i < 23;i ++ ) {
        res[i + 1] = (res[i] + handle_arr_1[i] + handle_arr_2[i]) / 2;
        res[i] = (res[i] + handle_arr_1[i] + handle_arr_2[i]) % 2;
    }
    if (res[23] == 1)
        *flag = 1;
    for (i = 0;i < 23;i ++ )
        result[22 - i] = res[i];
    return result;
}

char* shift(int *shift_ptr, int bytes)
{
    int i = 0;
    bytes = bytes - 1;
    int array[27];
    char *res_array = (char *)malloc(100);
    memset(res_array, 0, 100);
    for (i = 0;i < bytes; i++ )
        res_array[i] = '0';
    res_array[bytes] = '1';
    for (i = bytes + 1;i < bytes + 24;i ++ )
        res_array[i] = shift_ptr[i - 1 - bytes] + '0';
    return res_array;
}

float addfloat(char float1[], char float2[], int m, int n)
{
    int i = 0;
    int flag_1 = float1[0] - '0';
    int flag_2 = float2[0] - '0';
    int exponent_1[8], exponent_2[8];
    int final_1[27], final_2[27];
    int inf_flag_1 = 0, inf_flag_2 = 0;
    for (i = 1;i <= 8;i ++ ) {
        exponent_1[8 - i] = float1[i] - '0';
        exponent_2[8 - i] = float2[i] - '0';
        if (exponent_1[8 - i] == 0) inf_flag_1 = 1;
        if (exponent_2[8 - i] == 0) inf_flag_2 = 1;
    }
    if (inf_flag_1 == 0 || inf_flag_2 == 0 && (float1[0] == '0' && float2[0] == '0')) {
        printf("正上溢\n");
        return 0;
    } else if (inf_flag_1 == 0 || inf_flag_2 == 0 && (float1[0] == '0' && float2[0] == '0')) {
        printf("负上溢\n");
        return 0;
    } else if (inf_flag_1 == 0 || inf_flag_2 == 0 && (float1[0] != float2[0])) {
        printf("0\n");
        return 0;
    }
    for (i = 9;i < 32;i ++ ) {
        final_1[i - 9] = float1[i] - '0';
        final_2[i - 9] = float2[i] - '0';
    }

    int exponent_res_1 = exponent(exponent_1),exponent_res_2 = exponent(exponent_2);
    int flag = 0, sum_integer = 0, exponent = 0;
    if (exponent_res_1 > exponent_res_2) {
        sum_integer = 1; exponent = exponent_res_1;
        char* final_array = shift(final_2, exponent_res_1 - exponent_res_2);
        for (i = 0;i < 23;i ++ )
            final_2[i] = final_array[i] - '0';
    } else if (exponent_res_1 < exponent_res_2) {
        sum_integer = 1; exponent = exponent_res_1;
        char* final_array = shift(final_1, exponent_res_2 - exponent_res_1);
        for (i = 0;i < 23;i ++ )
            final_1[i] = final_array[i] - '0';
    } else {
        sum_integer = 2;
        exponent = exponent_res_1;
    }
    int* array = add(final_1, final_2, &flag);
    sum_integer += flag;
    float result = 0;
    for (i = 0;i < 23;i ++ )
        result += pow(2, -i-1) * array[i];
    result = (result + sum_integer) * pow(2, exponent);
    if (flag_1)
        result = -result;
    return result;
}

int err_code = -1;

unsigned mul(char int1[], char int2[], int m, int n)
{
    int i = 0, j = 0;
    int arr_mul_sum[10];
    int array_result[10];
    int arr_1[5], arr_2[5];
    for (i = 0;i < 10;i ++ )
        arr_mul_sum[i] = 0, array_result[i] = 0;
    for (i = 0;i < 5;i ++ )
        arr_1[i] = 0, arr_2[i] = 0;
    for (i = 0;i < m;i ++ )
        arr_1[m - 1 - i] = int1[i] - '0';
    for (i = 0;i < n;i ++ )
        arr_2[n - 1 - i] = int2[i] - '0';
    for (i = 0;i < 4;i ++ ) {
        for (j = 0;j < 4;j ++ )
            arr_mul_sum[j + i] += arr_1[i] & arr_2[j];
    }
    for (i = 0;i < 10;i ++ ) {
        arr_mul_sum[i + 1] = arr_mul_sum[i] / 2 + arr_mul_sum[i+1];
        arr_mul_sum[i] = arr_mul_sum[i] % 2;}
    printf("结果: ");
    for (i = 7;i >= 0;i -- ) {
        printf("%d", arr_mul_sum[i]);
        if(i == 4)
            printf(" ");
    }
    printf("\n");
    return 1;
}

int main()
{
    char int1[5], int2[5];
    char float1[33], float2[33];
    //gets(int1);
    //gets(int2);
    gets(float1);
    gets(float2);
    removeBlank(float1);
    removeBlank(float2);
    float res_float = addfloat(float1, float2, strlen(float1), strlen(float2));
    printf("%f\n", res_float);
    //unsigned int a = mul(int1, int2, strlen(int1), strlen(int2));
    return 0;
}

浮点数加法:
在这里插入图片描述
在这里插入图片描述

无符号数乘法:

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka触发Rebalance的场景分析

文章目录前言触发Rebalance的原因1. 消费者成员发生变化2. 分区数发生变化3. 订阅Topic发生变化Rebalance全流程介绍场景一&#xff1a;新成员入组场景二&#xff1a;成员主动离组场景三&#xff1a;成员崩溃离组场景四&#xff1a;组成员提交位移前言 所谓Rebalance就是让Con…

Python小工具-复制嵌套目录下的多个word文档到指定目录

文章目录Python小工具-复制嵌套目录下的多个word文档到指定目录需求原始数据工具实现思路代码实现1-6 配置项目7 定义file_type_to_reduce_dir函数完成文件复制或移动8 定义list_dir_by_level函数完成遍历调用函数并执行待改进地方完整代码自我反省Python小工具-复制嵌套目录下…

全志 Linux 系统启动优化 启动优化速度方式 优化启动流程 优化uboot 优化kernel等

文章目录1 概述2 启动速度优化简介2.1 启动流程2.2 测量方法2.2.1 printk time2.2.2 initcall_debug2.2.3 bootgraph.2.2.4 bootchart2.2.5 gpio 示波器.2.2.6 grabserial.2.3 优化方法2.3.1 boot0启动优化2.3.1.1 非安全启动.2.3.1.2 安全启动2.3.2 uboot启动优化2.3.2.1 完全…

07、SpringCloud 系列:Alibaba - 介绍

SpringCloud 系列列表&#xff1a; 文章名文章地址01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/12831902302、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/12833228803、OpenFeign - 远程调用https://blog.csdn.…

一套ASP.NET优惠券领取微信小程序源码(前台+后台)

ASP.NET优惠券领取微信小程序源码&#xff08;前台后台&#xff09; 源码免费分享&#xff01;需要源码学习可私信我。 一、源码特点 1、这是一个微信小程序对接淘宝的淘宝客api自助搜索优惠券领取程序&#xff0c;简单易学。 2、后台采用asp.netMvc框架开发、实现了调用阿里妈…

Java I/O(五)NIO应用之Netty

Netty 目录Netty1 Netty概览2 Netty核心组件2.1 Bootstrap和ServerBootStrap&#xff08;启动引导类&#xff09;2.2 Channel&#xff08;网络操作抽象类&#xff09;2.3 EventLoop&#xff08;事件循环&#xff09;2.4 EventLoopGroup&#xff08;事件循环组&#xff09;2.7 C…

【Vue】创建 Vue 实例与对象配置、容器与实例的关系、插值延伸和 Vue 开发工具的初步使用

创建 Vue 实例 引入 Vue 注意在 Head 中 <script type"text/javascript" src"./vue.js"></script>另一个 javascript 中创建 Vue 实例&#xff0c;注意在 Body 尾部 <script type"text/javascript">const x new Vue() <…

12. 目前常用的四种信道复用方式:()、()、()和() ---- 计算机网络

目前常用的四种信道服用方式&#xff1a;&#xff08;频分复用&#xff09;、&#xff08;时分复用&#xff09;、&#xff08;码分复用&#xff09;和&#xff08;波分复用&#xff09; 知识点 复用&#xff08;multiplexing&#xff09;&#xff1a;就是在一个信道上传输多路…

java SE阶段面试题

目录 1、Java 的数据类型有哪些&#xff1f; 2、变量的三要素是什么&#xff1f;变量使用有什么要求&#xff1f; 3、基本数据类型变量和引用数据类型变量有什么区别&#xff1f; 4、Java 的运算符有几种意思&#xff1f; 5、Java 的自增、自减运算符在自增变量前后有什么区…

《计算机网络》——第三章知识点

第三章思维导图 链路层的信道类型 一对一:点对点信道 —对多:广播信道 链路层要解决的问题 封装成帧 透明传输 差错检测密封&#xff0c;透气性差 封装成帧就是在一段数据的前后部分添加首部和尾部&#xff0c;这样就构成了一个帧。接收端在收到物理层上交的比特流后&#xff…

Pandas.to_csv()函数及全部参数使用方法一文详解+实例代码

目录 前言 一、基础语法与功能 二、参数说明和代码演示 1.path_or_buf 选择文件/文件路径写入 2.sep 指定分隔符 3.na_rep 指定缺少数据表示 4.float_format 指定浮点型字符串输出格式 5. columns 指定要写入的列 6.header 是否需要写入列名 7.index 是否写入行名称&am…

【实时数仓】Sugar拉取数据展示、品牌销售排行接口、品类销售占比接口和热门商品SPU排名接口的实现

文章目录一 Sugar拉取数据展示1 内网穿透&#xff08;1&#xff09;作用&#xff08;2&#xff09;工具&#xff08;3&#xff09;本机ip地址&#xff08;4&#xff09;花生壳配置2 配置组件二 品牌销售排行接口1 Sugar配置&#xff08;1&#xff09;图表配置&#xff08;2&…

2022《粤语好声音-乐队风暴》全国总决赛圆满收官!

2022年12月17日&#xff0c;由广东珠江、盛娱星汇海选联合主办的2022《粤语好声音-乐队风暴》全国总决赛在广州增城1978电影小镇正式拉开帷幕。从海选到全国总决赛&#xff0c;2022《粤语好声音-乐队风暴》在21座城市中&#xff0c;通过线上线下双模式开展&#xff0c;历时6个月…

OpManager 虚拟化管理

什么是虚拟化 虚拟化是创建计算资源的虚拟形式&#xff0c;如计算机、服务器或其他硬件组件&#xff0c;或基于软件的资源&#xff08;如操作系统&#xff09;。虚拟化最常见的示例是在操作系统安装期间对硬盘进行分区&#xff0c;其中物理硬盘驱动器被拆分为多个逻辑磁盘以提…

重点 |中级软件设计师易混淆知识点 (1)

本文章总结了软件设计师考试易混淆知识点&#xff01;&#xff01;&#xff01; 帮助大家更好的复习&#xff0c;希望能对大家有所帮助 比较长&#xff0c;放了部分&#xff0c;需要可私信&#xff01;&#xff01; 易混淆点1&#xff1a;原、反、补码的运算 1、原码&#x…

Технокубок 2021 - Финал C. Basic Diplomacy

翻译&#xff1a; Aleksey有&#x1d45b;个朋友。他现在也在度假&#xff0c;所以他有&#x1d45a;天来玩这款新的病毒式合作游戏!但由于它是合作的&#xff0c;阿列克谢将需要一个队友在每个&#x1d45a;天。 在这些日子里&#xff0c;每天都有一些朋友可以玩&#xff0c…

Spring 依赖注入

文章目录流程图依赖注入的方式手动注入自动注入XML的autowire自动注入autowire BY_NAME 与 BY_TYPE(已过时)执行时机&#xff1a;AUTOWIRE_BY_NAMEAUTOWIRE_BY_TYPEAutowired注解的处理(含Value&#xff0c;Inject)AutowiredAnnotationBeanPostProcessorresolveDependencyfindA…

机器学习——线性模型学习

线性回归 主要目标确定 如何确定w和b呢&#xff1f;关键在于如何衡量f(x)与y的差别 此种衡量误差的方法称为均方误差也称为欧式距离 求解w和b使上述方程最小化的过程称为线性回归模型的最小二乘”参数估计“ 多元线性回归 针对多个属性的数据集D&#xff0c;此时试图学得 …

DHCP学习

目录 DHCP基本认识和原理 场景一、同网段DHCP 场景二、不同段DHCP&#xff08;中继DHCP&#xff09; DHCP基本认识和原理 DHCP&#xff08;Dynamic Host Configuration Protocol动态主机协议&#xff09;。 作用&#xff1a;为局域网络中主机动态分发地址&#xff0c;以及…

INMP441麦克风芯片--支持I2S、ESP32

1.简介 INMP441是InvenSense公司推出的一款具有底部端口的高信噪比、低功耗、数字输出的全向MEMS麦克风&#xff0c;信噪比高达61dB&#xff0c;使其成为近场应用的绝佳选择。INMP441的电路结构如图所示&#xff0c;包括MEMS声音传感器、模数转换器&#xff08;ADC&#xff09…