VB6编程IEEE浮点算法实践

news2024/11/18 11:46:43

纯代码实现浮点计算实际上对浮点算法的再实践。IEEE浮点表示法是Modbus RTU协议至今还在用的传送编码,更是WITS 1记录标准的基础。以往实现 MKI、CVI,MKL、CVL,MKS、CVS,MKD、CVD在高级语言里封装了现成的语句,现在PowerBasic和FreeBasic也可以将这些语句封闭到 DLL 中供其它语言调用。不过还是重编代码,对算法的演练更到位。

1. MKI/CVI

要点:对输入数据取整,判断正负,正数直接转换,负数加上65536后转换。输入数据分成高低各16位数据,范围在 &H0000 - &HFFFF之间。

Function MKI(ByVal iData As Integer) As String
    'MKI 16bits &HFFFF -32768 to 32767 8000-7fff
    Dim inData As Long
    Dim HiByte As Long, LoByte As Long
    
    inData = Fix(iData)
    If inData < 0 Then inData = inData + 65536
    
    LoByte = inData And &HFF
    HiByte = (inData \ 2 ^ 8) And &HFF
    
    MKI = Right$(("0" + Hex$(HiByte)), 2) + Right$(("0" + Hex$(LoByte)), 2)
End Function

2. MKL/CVl

MKL实现方法与MKI类似,它是32位的,因此输入的数据分成四个8位数据,在VB6中用Currency类型变量表示更便于计算。

Function MKL(ByVal lData As Long) As String
    Dim Phi4 As Currency, Phi3 As Currency, Phi2 As Currency, Phi1 As Currency
    Dim inData As Currency
    inData = Fix(lData)
    Phi4 = inData And &HFF
    Phi3 = (inData \ 2 ^ 8) And &HFF
    Phi2 = (inData \ 2 ^ 16) And &HFF
    Phi1 = (inData \ 2 ^ 24) And &HFF
    MKL = Right$(("0" + Hex$(Phi1)), 2) + Right$(("0" + Hex$(Phi2)), 2) + Right$(("0" + Hex$(Phi3)), 2) + Right$(("0" + Hex$(Phi4)), 2)
End Function

3. MKS/CVS

右移位求得整数部分二进制串,小数部分乘2取整形成小数二进制串,合并二进制串左移或右移小数点位置并舍去高位的 1 ,移位值加上127形成 exp 指数, 正负符号用0或1表示,结果是 s+exp+余下的小数。

    OffSetBits = 8
    AcuFactor = 32: OffSet = 127

    inData = sData
    
    inDataSingn = 0
    If inData < 0 Then inDataSingn = 1
    
    inData = Abs(inData)    'ignore singn
    ipart = Int(inData): fpart = (inData - ipart)
    
    If inData = 0 Then
        CaseID = 0
    Else
        'Convert ipart, the integer part, into byte array TempData1 MSB to LSB
        tipart = ipart: TempString = ""
        For I = 1 To AcuFactor
            TempString = Right$(Str$(tipart And &H1), 1) + TempString
            tipart = tipart \ 2 ^ 1
        Next I
        For I = 1 To AcuFactor
            If Mid$(TempString, I, 1) = "1" Then Exit For
            Mid$(TempString, I, 1) = " "
        Next I
            IntiStr = Trim(TempString)
    
        'Convert fpart, the fraction part, into byte array TempData2
        tfpart = fpart: TempString = ""
        For I = 1 To AcuFactor
            If tfpart = 0 Then Exit For
            tfpart = tfpart * 2
            tnpart = Int(tfpart): tfpart = tfpart - tnpart
            TempString = TempString + Right$(Str$(tnpart And &H1), 1)
        Next I
            FracStr = TempString
            
        If ipart > 0 Then CaseID = 1
        If ipart = 0 Then CaseID = 2
    End If

4. MKD/CVD

与MKS类同,只是exp由8位增加至11位,偏移值由127变为1023

    OffSetBits = 11
    AcuFactor = 64: OffSet = 1023

    inData = sData
    
    inDataSingn = 0
    If inData < 0 Then inDataSingn = 1
    
    inData = Abs(inData)    'ignore singn
    ipart = Int(inData): fpart = (inData - ipart)
    
    If inData = 0 Then
        CaseID = 0
    Else
        'Convert ipart, the integer part, into byte array TempData1 MSB to LSB
        tipart = ipart: TempString = ""
        For I = 1 To AcuFactor
            TempString = Right$(Str$(tipart And &H1), 1) + TempString
            tipart = tipart \ 2 ^ 1
        Next I
        For I = 1 To AcuFactor
            If Mid$(TempString, I, 1) = "1" Then Exit For
            Mid$(TempString, I, 1) = " "
        Next I
            IntiStr = Trim(TempString)
    
        'Convert fpart, the fraction part, into byte array TempData2
        tfpart = fpart: TempString = ""
        For I = 1 To AcuFactor
            If tfpart = 0 Then Exit For
            tfpart = tfpart * 2
            tnpart = Int(tfpart): tfpart = tfpart - tnpart
            TempString = TempString + Right$(Str$(tnpart And &H1), 1)
        Next I
            FracStr = TempString
            
        If ipart > 0 Then CaseID = 1
        If ipart = 0 Then CaseID = 2
    End If

最后的结果都要变成十六进制字符,以便传送和文件存储。

源代码下载:

https://download.csdn.net/download/weixin_45707491/88232263?spm=1001.2014.3001.5503

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

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

相关文章

vue3实现扇形展示

vue3实现扇形展示 效果 html部分 <div class"box1"><div class"box"><div class"single" v-for"(item,index) in arr" :key"index":style"transform:rotate(angle[index]deg);transform-origin: 10px…

LLM应用的例子LLM use cases and tasks

您可能会认为LLMs和生成性AI主要关注聊天任务。毕竟&#xff0c;聊天机器人非常受到关注并且备受瞩目。下一个词的预测是许多不同功能背后的基本概念&#xff0c;从基本的聊天机器人开始。 但是&#xff0c;您可以使用这种概念上简单的技术执行文本生成中的其他各种任务。例如…

分布式锁实现方式

分布式锁 1 分布式锁介绍 1.1 什么是分布式 一个大型的系统往往被分为几个子系统来做&#xff0c;一个子系统可以部署在一台机器的多个 JVM(java虚拟机) 上&#xff0c;也可以部署在多台机器上。但是每一个系统不是独立的&#xff0c;不是完全独立的。需要相互通信&#xff…

作为一个产品经理怎么做一个项目的需求文档?(附有需求文档的部分展示)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于需求文档的相关操作吧 首先&#xff0c;我们需求明确的是&#xff0c;一个产品经理究竟需要做些什么&#xff1f;在项目的阶段中起到哪一些作用 一.编写产品需…

大数据面试题:Spark的任务执行流程

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a;1&#xff09;Spark的工作流程&#xff1f;2&#xff09;Spark的调度流程&#xff1b;3&#xff09;Spark的任务调度原理&#xf…

插入排序优化——超越归并排序的超级算法

插入排序及优化 插入排序算法算法讲解数据模拟代码 优化思路一、二分查找二、copy函数 优化后代码算法的用途题目&#xff1a;数星星&#xff08;POJ2352 star&#xff09;输入输出格式输入格式&#xff1a;输出格式 输入输出样例输入样例输出样例 题目讲解步骤如下AC 代码 插入…

GPDB-疑难杂症-PlaceHolderVar

GPDB-疑难杂症-PlaceHolderVar 从GPDB5升级到GPDB6时&#xff0c;遇到以往可以执行的SQL不能执行了。报错&#xff1a;PlaceHolderVar found where not expected!语法不兼容了&#xff1f; postgres# CREATE TABLE t1( id1 int) WITH (appendonlytrue, compresstypenone, b…

@Repeatable的作用以及具体如何使用

文章目录 1. 前言2. 先说结论3. 案例演示 1. 前言 最近无意看到某些注解上有Repeatable&#xff0c;出于比较好奇&#xff0c;因此稍微研究并写下此文章。 2. 先说结论 Repeatable的作用&#xff1a;使被他注释的注解可以在同一个地方重复使用。 具体使用如下&#xff1a; T…

shell脚本文本 三剑客AWK

TOC 一.AWK工具介绍 AWK是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具可以在无交互的模式下实现复杂的文本操作相较于sed常作用于一整行的处理&#xff0c;awk则比较倾向于一行当中分成数个字段来处理&#xff0c;因为awk相当适合小型的文本数据 1.1AWK命令…

听GPT 讲Prometheus源代码--discovery

Prometheus是一个开源的系统监控和警报工具包&#xff0c;以下是Prometheus源代码中一些主要的文件夹及其作用&#xff1a; cmd/&#xff1a;这个目录包含了Prometheus主要的命令行工具&#xff0c;如prometheus/&#xff0c;promtool/等。每个子目录都代表一个可执行的命令行应…

Unsafe upfileupload

文章目录 client checkMIME Typegetimagesize 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等&#xff0c;然后将其按…

高德地图开发者平台Python应用实践:快速入门周边商业环境信息查询

高德地图开发平台提供了丰富的API接口&#xff0c;可以方便地进行地图数据的开发和分析。在商业分析数据采集中&#xff0c;使用高德地图开发平台的周边查询功能可以快速获取周边商圈、小区等信息&#xff0c;为商业决策提供数据支持。 针对您的需求&#xff0c;我建议采用以下…

stream.map return

出现以下告警信息 Statement lambda can be replaced with expression lambda less... (CtrlF1) This inspection reports lambda expressions with code block bodies when expression-style bodies can be used 将 List<StudentDetailDto> studentDetailDtoList link…

防丢器Airtag国产版

Airtag是什么&#xff1f; AirTag是苹果公司设计的一款定位神奇&#xff0c;它通过一款纽扣电池进行供电&#xff0c;即可实现长达1-2年的关键物品的定位、查找的功能。 按照苹果公司自己的话说—— 您“丢三落四这门绝技&#xff0c;要‍失‍传‍了”。 AirTag 可帮你轻松追…

Objectarx 2021使用vs2019生成报错 /RTCc rejects conformant code

error C2338: /RTCc rejects conformant code错误解决 使用VS2019/VS2022生成项目报错 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1189 #error: /RTCc rejects conformant code, so it is not supported by the C Standard Library. Either remove this compiler opti…

网络安全---webshell实践

一、首先环境配置 1.上传文件并解压 2.进入目录下 为了方便解释&#xff0c;我们只用两个节点&#xff0c;启动之后&#xff0c;大家可以看到有 3 个容器&#xff08;可想像成有 3 台服务器就成&#xff09;。 二、使用蚁剑去连接 因为两台节点都在相同的位置存在 ant.jsp&…

vue2.6升级vue2.7(panjiachen升级指南)vue-cli5多页面应用升级的坑

vue2.7升级指南 vue2.7升级指南 之前的架子使用的是 panjiachen&#xff0c;使用的是 vue2.6.14&#xff0c;现在升级为 vue2.7.x 升级vue/cli vue upgrade 这里推荐使用 vue upgrade 命令自动升级 # 确保安装全局 vue/cli $ npm install -g vue/cli $ vue upgradeWARN Th…

Vue 2 自定义指令

Vue 2自定义指令 Vue自定义指令允许我们在DOM元素上添加自己想要的行为来扩展Vue的功能。 一个自定义指令需要一个名称和一个定义对象。在定义对象中&#xff0c;你可以使用一些钩子函数来控制指令的行为&#xff1a; bind&#xff1a;在指令被绑定到元素上时使用&#xff0…

基于IMX6ULLmini的linux裸机开发系列七:中断处理流程

中断上下文 cpu通过内核寄存器来运行指令并进行数据的读写处理的&#xff0c;它在进入中断前一个时刻的具体值&#xff0c;称为中断上下文 中断上下文是指CPU在进入中断之前保存的寄存器状态和其他相关信息。当CPU接收到中断请求时&#xff0c;它会保存当前正在执行的指令的状…

广州华锐互动:3D数字孪生开发编辑器助力企业高效开发数字孪生应用

3D数字孪生开发编辑器是一种新兴的技术&#xff0c;它可以帮助企业更好地管理和维护其物联网设备。这些工具可以帮助企业实现对设备的实时监控、故障排除和优化&#xff0c;从而提高生产效率和降低成本。 数字孪生系统是一种将物理世界与数字世界相结合的技术&#xff0c;它可以…