我正在开发一个小项目,我需要浮点乘法和16位浮点数(半精度)。不幸的是,我遇到了算法的一些问题:

示例输出

1 * 5 = 5

2 * 5 = 10

3 * 5 = 14.5

4 * 5 = 20

5 * 5 = 24.5

100 * 4 = 100

100 * 5 = 482

源代码

const int bits = 16;

const int exponent_length = 5;

const int fraction_length = 10;

const int bias = pow(2, exponent_length - 1) - 1;

const int exponent_mask = ((1 << 5) - 1) << fraction_length;

const int fraction_mask = (1 << fraction_length) - 1;

const int hidden_bit = (1 << 10); // Was 1 << 11 before update 1

int float_mul(int f1, int f2) {

int res_exp = 0;

int res_frac = 0;

int result = 0;

int exp1 = (f1 & exponent_mask) >> fraction_length;

int exp2 = (f2 & exponent_mask) >> fraction_length;

int frac1 = (f1 & fraction_mask) | hidden_bit;

int frac2 = (f2 & fraction_mask) | hidden_bit;

// Add exponents

res_exp = exp1 + exp2 - bias; // Remove double bias

// Multiply significants

res_frac = frac1 * frac2; // 11 bit * 11 bit → 22 bit!

// Shift 22bit int right to fit into 10 bit

if (highest_bit_pos(res_mant) == 21) {

res_mant >>= 11;

res_exp += 1;

} else {

res_mant >>= 10;

}

res_frac &= ~hidden_bit; // Remove hidden bit

// Construct float

return (res_exp << bits - exponent_length - 1) | res_frac;

}

顺便说一下:我将浮点数存储在整数中,因为我会尝试将此代码移植到某种没有浮点操作的汇编程序。

问题

为什么代码仅适用于某些值?我忘记了一些规范化或类似的吗?或者它只是偶然起作用?

免责声明:我不是CompSci学生,它是一个休闲项目;)

更新#1

感谢Eric Postpischil的评论,我注意到代码存在一个问题:hidden_bit标志被一个人关闭(应该是1 << 10)。有了这个改变,我不再获得小数位数,但仍有一些计算结果(例如3•3=20)。我假设,它是res_frac转变,如答案中所描述的那样。

更新#2

代码的第二个问题确实是res_frac转移。在更新#1之后,当得到frac1 * frac2的22位结果时,我得到了错误的结果。我已使用更正的班次语句更新了上面的代码。感谢所有的评论和回答! :)

16位浮点 c语言,C语言中的16位浮点乘法相关推荐

  1. 在c语言中以16位pc机为例一个,在C语言中(以16位pc机为例),一个char型数据在内...

    话题:在C语言中(以16位pc机为例),一个char型数据在内存中所占字节回答:标准的C语言范中:char占一个字节int占4个字节话题:计算机中16位的数据如何存放在32位的寄存器中回答:如果是 w ...

  2. 8位alu运算器(vhdl语言)_C语言中signed char类型,能表示-128到127,为什么负数多一位?...

    初学者在学习C语言,谈到不同数据类型时,一般都能理解 unsigned 和 signed 的区别,无非就是有无符号而已.但是对于 signed 数据类型的数据范围,初学者却常常会感到迷惑. 对于 si ...

  3. 保留小数点后1位c语言,C语言中%f表示的是什么,为什么有时小数点后保留6位,有时小数点后保留1位...

    printf("%f",fVal);//这是浮点默认输出格式,小数点保留6位 printf("%.1f",fVal);//.1是说明,小数点保留1位,对其后的数 ...

  4. 函数用法r语言_R语言中的apply函数族

    前言 apply函数族是R语言中数据处理的一组核心函数,通过使用apply函数,我们可以实现对数据的循环.分组.过滤.类型控制等操作.但是,由于在R语言中apply函数与其他语言循环体的处理思路是完全 ...

  5. table是什么函数c语言,c语言中table的用法

    c语言中table的用法 c语言中table的用法的用法如下:1 说明1.1 RECORD定义记录数据类型. 它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的.分离 ...

  6. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

  7. map函数作用c语言,c语言中map的用法:map基本用法

    c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...

  8. sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】

    计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...

  9. div c语言,c语言中的div的用法是什么?

    c语言中的div的用法: 函数名: div 功 能: 将两个整数相除, 返回商和余数 用 法: div_t (int number, int denom); 程序例: # include #inclu ...

最新文章

  1. 干货|最全面的卷积神经网络入门教程
  2. Android 环境配置
  3. 排序算法-08基数排序(python实现)
  4. 如何使用Apache Drill分析高度动态的数据集
  5. MySQL日期处理-查询间隔数据
  6. Python爬虫扩展库scrapy选择器用法入门(一)
  7. AttributeError: ‘SMOTE’ object has no attribute ‘fit_sample’
  8. Mysql主从占用大量cpu_Mysql占用过高CPU时的优化手段
  9. C风格简易本地log系统
  10. Uva 11054 - Wine trading in Gergovia(模拟)
  11. Fall 2020 Berkeley cs61a hw02答案
  12. 《人月神话》读后感与读书笔记
  13. 第八问:hub 集线器是啥,作用
  14. Sentinel 控制台 不显示实时监控
  15. Mongodb模式设计
  16. 苹果cms10自适应模板好看的苹果cmsv10美化模板免费
  17. 软件发布各版本代号含义
  18. [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)
  19. 第一章:第1章 CRM核心业务介绍--概述,crm架构,公司组织结构,软件开发的生命周期,crm项目的核心业务介绍。...
  20. RGB-D论文复习速读

热门文章

  1. .Net Core 开发成长路线图
  2. 思科CCNA第二学期期末考试答案
  3. sensei鼠标测试软件,'黑科技'传感器打造出的FPS利器 - 赛睿Sensei 310 鼠标
  4. 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...
  5. 桔子浏览器电脑版如何登录 桔子浏览器PC版账号登录教程
  6. win7系统还原失败怎么解决
  7. jeecg <t:choose 功能标签用法修改 处理选择0条记录回写
  8. mongodb 数组查询 php,关于PHP,查询mongodb里的数组的问题
  9. java请编写公共类继承抽象类_(Java相关)怎么理解抽象类,继承和接口?
  10. python中最难的是什么_Python 最难的问题你猜是什么?