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位结果时,我得到了错误的结果。我已使用更正的班次语句更新了上面的代码。感谢所有的评论和回答! :)

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

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

相关文章

pitr 原理_PostgreSQL基于时间点恢复(PITR)

OS 环境&#xff1a;CentOS 6.2数据库 &#xff1a;PostgreSQL 9.1.3pg_home/home/postgres/pg_data/database/pgdata/一、前期工作既要恢复&#xff0c;肯定是需要一个备份基础的&#xff0c;否则再怎么的巧妇也难为无米之炊。1.修改数据库参数&#xff0c;修改postgresql.con…

c++类和对象初步

程序设计与算法&#xff08;三&#xff09;C面向对象程序设计-郭炜 第二周 总结整理&#xff1a; 目录&#xff1a; 1.类成员的可访问范围2.成员函数的 重载及参数缺省3.构造函数 (constructor)4.复制构造函数 copy constructor5.类型转换构造函数6.析构函数 destructors 1…

imx6ull用video4linux,CB140(imx6ull)使用Openwrt系统

主机平台&#xff1a; UBUNTU14.04硬件平台&#xff1a;明远智睿MY-IMX6-EK140P (其他平台也是)编译器: gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf.tar.xz内核版本 linux-4.1.15文件系统&#xff1a; openwrt_last_rootfs.tar.bz2 (附件有)简介&#xff1a;…

分步表单_表单设计-掌握表单设计方法(表单体验篇)

全篇阅读大概需要15min&#xff0c;对表单设计不熟悉的同学看完后肯定会有不少的收获~~~说到表单其实在生活中可以接触到各种各样的表单&#xff0c;比如&#xff1a;驾照申请表、体检表、银行开户需要填写的表等等&#xff0c;这些都是表单&#xff0c;主要目的就是让用户填写…

类和对象提高

程序设计与算法&#xff08;三&#xff09;C面向对象程序设计-郭炜 第三周 总结整理&#xff1a; 目录&#xff1a; 1.this指针2.静态成员3.成员对象和封闭类4.友元 &#xff08;friends)5.常量成员函数 1.this指针 C程序到C程序的翻译 class CCar { public: int price;…

4)lsof linux命令,***Linux命令实时监测系统(top,htop,iotop,lsof,tcpdump,netstat,vmstat,iostat)...

摘要&#xff1a;本文总结了8个非常实用的Linux命令行性能监测工具&#xff0c;这些命令支持所有的Linux系统&#xff0c;不仅可以用于监控系统&#xff0c;还可以发现导致性能问题的原因所在。对每个系统/网络管理员来说&#xff0c;每天监测Linux系统性能是一项非常艰巨的任务…

算法竞赛入门经典 第七章 总结

目录&#xff1a; 7.1 简单枚举7.2 枚举排列7.3 子集生成 7.1 简单枚举 例题7-1 除法&#xff08;Division, UVa 725&#xff09; 输入正整数n&#xff0c;按从小到大的顺序输出所有形如abcde/fghij n的表达式&#xff0c;其中a&#xff5e;j恰好 为数字0&#xff5e…

bootstraptable 列隐藏_bootstrap中table如何隐藏列?

Bootstrap如何隐藏table中的某一列&#xff1f;下面本篇文章给大家介绍一下。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。Bootstrap隐藏table中的某一列1、利用bootstrapTable来设置要隐藏和显示的列$(function () {//初始化tableL…

华为android强刷系统下载地址,华为强刷救砖卡刷包合集下载(一)共707GB

(High Level Repair Center is forbidden)Berlin-AL10AC00B381_Android7.0_EMUI5.0_05014NVD.zip(High Level Repair Center is forbidden)GRA-CL00_C92B370_Android6.0_EMUI4.0.2_05012QKC.zipMLA-AL10C00B360_Android7.0_EMUI5.0.1_05014DHN.zipMLA-UL00_C17B170_China_联通…

线性表总结

线性表及其实现多项式的表示什么是线性表线性表的抽象数据类型描述线性表的顺序存储实现线性表的链式存储实现 线性表及其实现 多项式的表示 [例] 一元多项式及其运算 一元多项式 &#xff1a; 主要运算&#xff1a;多项式相加、相减、相乘等 【分析】如何表示多项式?…

md 生成目录 码云_搭建简易博客方案

现在大家都喜欢用markdown来写技术博客&#xff0c;这篇文章将阐述搭建支持markdown的简易博客方法。我的写作需求通过阅读本文&#xff0c;您将学会搭建满足以下条件的博客&#xff1a;博客只用书写markdown文件能支持版本控制免费&#xff0c;不需要租服务器或主机编写、部署…

mix2s android p功能,已升安卓P!网友:MIX2S才是亲儿子

原标题&#xff1a;已升安卓P&#xff01;网友&#xff1a;MIX2S才是亲儿子一直以来&#xff0c;小米在手机系统更新上都有着非常明显的优势&#xff0c;MIUI经过了多年的更新迭代&#xff0c;如今已经达到了非常不错的易用性&#xff0c;而且流畅度方面的表现更是优秀。如今小…

python爬取图片的步骤_Python爬取图片的过程分析

一、获取网页源码二、数据解析&#xff0c;得到图片的地址、部分文字作为文件名三、返回图片的二进制字节码四、保存图片文件到本地import requestsfrom lxml import etreeimport osheaders {User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36…

堆栈总结

堆栈什么是堆栈堆栈的抽象数据类型描述栈的顺序存储实现 堆栈 什么是堆栈 计算机如何进行表达式求值&#xff1f; 算术表达式56/2-3*4。 正确理解&#xff1a; 56/2-3*4 53-3*4 8-3*4 8-12 -4 由两类对象构成的&#xff1a; 运算数&#xff0c;如2、3、4 运算符号…

nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)

from: http://wszf.net/archives/2012/11/07/80510.html一般来说&#xff0c;给予MifareClassic的射频卡&#xff0c;一般内存大小有3种&#xff1a;1K: 16个分区(sector)&#xff0c;每个分区4个块(block)&#xff0c;每个块(block) 16个byte数据2K: 32个分区&#xff0c;每个…

android8 通知呼吸灯_Android8.0及以上的Notification

这篇文章上次修改于 702 天前&#xff0c;可能其部分内容已经发生变化&#xff0c;如有疑问可询问作者。在新版本上(Android8.0及以上)开发时&#xff0c;会遇到一些问题&#xff0c;比如&#xff0c;不显示通知&#xff0c;Notification 声音不可控&#xff0c;删除 channel 删…

harmonyos公测招募,nova为主 HarmonyOS 2.0开发者Beta公测再招募

原标题&#xff1a;nova为主 HarmonyOS 2.0开发者Beta公测再招募HarmonyOS 2.0开发者Beta公测招募将开启第二期&#xff0c;本次公测活动主要针对的机型是华为nova系列。活动报名时间为5月9日-5月17日。【PChome手机频道资讯报道】华为方面在4月份开启了HarmonyOS 2.0开发者Bet…

队列总结

什么是队列 队列(Queue)&#xff1a;具有一定操作约束的线性表 插入和删除操作&#xff1a;只能在一端插入&#xff0c;而在另一端删除 数据插入&#xff1a;入队列&#xff08;AddQ&#xff09; 数据删除&#xff1a;出队列&#xff08;DeleteQ&#xff09; 先来先服务 先…

python连接mongodb进行查询_Python中的MongoDB基本操作:连接、查询实例

这篇文章主要介绍了Python中的MongoDB基本操作&#xff1a;连接、查询实例,本文直接给出操作示例代码,需要的朋友可以参考下MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。它的特点是高性能、易部署、易使用&#…

D P- 免费馅饼

题目 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了&#xff0c;这馅饼别处都不掉&#xff0c;就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了&#xff0c;所以ga…