16位浮点 c语言,C语言中的16位浮点乘法
我正在开发一个小项目,我需要浮点乘法和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位浮点乘法相关推荐
- 在c语言中以16位pc机为例一个,在C语言中(以16位pc机为例),一个char型数据在内...
话题:在C语言中(以16位pc机为例),一个char型数据在内存中所占字节回答:标准的C语言范中:char占一个字节int占4个字节话题:计算机中16位的数据如何存放在32位的寄存器中回答:如果是 w ...
- 8位alu运算器(vhdl语言)_C语言中signed char类型,能表示-128到127,为什么负数多一位?...
初学者在学习C语言,谈到不同数据类型时,一般都能理解 unsigned 和 signed 的区别,无非就是有无符号而已.但是对于 signed 数据类型的数据范围,初学者却常常会感到迷惑. 对于 si ...
- 保留小数点后1位c语言,C语言中%f表示的是什么,为什么有时小数点后保留6位,有时小数点后保留1位...
printf("%f",fVal);//这是浮点默认输出格式,小数点保留6位 printf("%.1f",fVal);//.1是说明,小数点保留1位,对其后的数 ...
- 函数用法r语言_R语言中的apply函数族
前言 apply函数族是R语言中数据处理的一组核心函数,通过使用apply函数,我们可以实现对数据的循环.分组.过滤.类型控制等操作.但是,由于在R语言中apply函数与其他语言循环体的处理思路是完全 ...
- table是什么函数c语言,c语言中table的用法
c语言中table的用法 c语言中table的用法的用法如下:1 说明1.1 RECORD定义记录数据类型. 它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的.分离 ...
- c语言memcopy_C语言中memcpy 函数的用法详解
C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...
- map函数作用c语言,c语言中map的用法:map基本用法
c++中map容器提供一个键值对容器,那么你知道map的用法有哪些吗,下面秋天网 Qiutian.ZqNF.Com小编就跟你们详细介绍下c语言中map的用法,希望对你们有用. c语言中map的用法:m ...
- sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】
计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...
- div c语言,c语言中的div的用法是什么?
c语言中的div的用法: 函数名: div 功 能: 将两个整数相除, 返回商和余数 用 法: div_t (int number, int denom); 程序例: # include #inclu ...
最新文章
- 干货|最全面的卷积神经网络入门教程
- Android 环境配置
- 排序算法-08基数排序(python实现)
- 如何使用Apache Drill分析高度动态的数据集
- MySQL日期处理-查询间隔数据
- Python爬虫扩展库scrapy选择器用法入门(一)
- AttributeError: ‘SMOTE’ object has no attribute ‘fit_sample’
- Mysql主从占用大量cpu_Mysql占用过高CPU时的优化手段
- C风格简易本地log系统
- Uva 11054 - Wine trading in Gergovia(模拟)
- Fall 2020 Berkeley cs61a hw02答案
- 《人月神话》读后感与读书笔记
- 第八问:hub 集线器是啥,作用
- Sentinel 控制台 不显示实时监控
- Mongodb模式设计
- 苹果cms10自适应模板好看的苹果cmsv10美化模板免费
- 软件发布各版本代号含义
- [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)
- 第一章:第1章 CRM核心业务介绍--概述,crm架构,公司组织结构,软件开发的生命周期,crm项目的核心业务介绍。...
- RGB-D论文复习速读
热门文章
- .Net Core 开发成长路线图
- 思科CCNA第二学期期末考试答案
- sensei鼠标测试软件,'黑科技'传感器打造出的FPS利器 - 赛睿Sensei 310 鼠标
- 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...
- 桔子浏览器电脑版如何登录 桔子浏览器PC版账号登录教程
- win7系统还原失败怎么解决
- jeecg <t:choose 功能标签用法修改 处理选择0条记录回写
- mongodb 数组查询 php,关于PHP,查询mongodb里的数组的问题
- java请编写公共类继承抽象类_(Java相关)怎么理解抽象类,继承和接口?
- python中最难的是什么_Python 最难的问题你猜是什么?