符号计算

浮点数的二进制表示学习笔记

瘦欲@ 提交于 2020-02-23 10:11:34
最近和一个同事做关于浮点数的接口,顺带研究了一下。 基础知识: 十进制转十六进制; 十六进制转二进制; IEEE制定的浮点数表示规则; 了解: 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位 阶码 尾数 长度 float 1 8 23 32 double 1 11 52 64 以下通过几个例子讲解浮点数如何转换为二进制数 例一: 已知:double类型38414.4。 求:其对应的二进制表示。 分析:double类型共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位: 最高位63位是符号位,1表示该数为负,0表示该数为正; 62-52位,一共11位是指数位; 51-0位,一共52位是尾数位。 步骤:按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。 把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理: 0.4=0.5*0+0.25*1+0.125*1+0.0625*0+…… 实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了。隐藏位技术:最高位的1不写入内存(最终保留下来的还是52位)。

语音识别系统结构

妖精的绣舞 提交于 2020-02-23 00:16:07
转载: 语音识别系统结构——鸟瞰 语音识别概述 语音识别是指将语音信号转换为文字的过程。现在通行的语音识别系统框架如图: 信号处理模块将根据人耳的听觉感知特点,抽取语音中最重要的特征,将语音信号转换为特征矢量序列。现行语音识别系统中常用的声学特征有线性预测编码(Linear Predictive Coding,LPC),梅尔频率倒谱系数(Mel-frequency Cepstrum Coefficients,MFCC),梅尔标度滤波器组(Mel-scale Filter Bank,FBank)等。 解码器(Decoder)根据声学模型和语言模型,将输入的语音特征矢量序列转化为字符序列。 声学模型是对声学、语音学、环境的变量,以及说话人性别、口音的差异等的知识表示。语言模型则是对一组字序列构成的知识表示。 模型的训练 现代的语音识别系统中声学模型和语言模型主要利用大量语料进行统计分析,进而建模得到。 声学模型 语音识别中的声学模型充分利用了声学、语音学、环境特性以及说话人性别口音等信息,对语音进行建模。目前的语音识别系统往往采用隐含马尔科夫模型(Hidden Markov Model,HMM)建模,表示某一语音特征矢量序列对某一状态序列的后验概率。隐含马尔科夫模型是一种概率图模型,可以用来表示序列之间的相关关系,常常被用来对时序数据建模。 隐含马尔科夫模型是一种带权有向图

语法分析器原理简介

China☆狼群 提交于 2020-02-22 23:57:46
语法分析器原理简介 上下文无关语法(CFG) 为描述程序设计语言语法,传统的解决方案是使用上下文无关语法(Context Free Grammar, CFG)。对于语言L,其CFG定义了表示L语言中有效语句的符号串的集合。语句即是从语法规则G中推导出的一个字符串。 上下文无关语法G是一组规则,描述了语句是如何形成的。可以冲G导出的语句称为G定义的语言,记作 L ( G ) L(G) L ( G ) 。上下文无关语法定义语言的集合称为上下文无关语言的集合。 几个重要的概念: 产生式:CFG中的每个规则都称为一个产生式 非终结符:语法产生式中使用的语法变量 终结符:出现在语句中的单词。单词包含了一个词素(Lexeme)及范畴(Syntactic Category)。在语法中,单词通过其语法范畴表示。 推导:一系列重写步骤,从语法的起始符号开始,结束于语言中的一个语句。 在原型符号串中,我们选择一个非终结符 α \alpha α ,并选择一个语法规则 α → β \alpha \rightarrow \beta α → β ,然后将原型符号串中的 α \alpha α 重写为 β \beta β 。我们会重复这个重写过程,直至原型符号串不包含非终结符为止,此时它完全有单词(或称终结符)组成,已经变为语言中的一个语句。 在推导过程中的每一个点上,该符号串都是终结符和非终结符的一个集合

将中缀表达式转化成后缀表达式来计算值

假如想象 提交于 2020-02-22 18:04:46
题目很简单,就是给出一个表达式(例如2*(3+5)+6),然后我们得出他的值。 未接触这个方法前,我是用了一种很复杂的方法(爆肝警告) 将中缀表达式(就是我们要求的表达式)转化成后缀表达式来解决就会比较简单。 对于中缀表达式和后缀表达式的概念这里就不说了,只将方法呈现出来。 例如一个中缀表达式:A+(B-C/D)✖E,是如何将其转化成后缀表达式:ABCD/-E✖+的?(忽略乘号的特殊) 直接介绍下方法,对这个中缀表达式依次进行扫描,如果是 数字 ,则直接存入放后缀表达式的数组中;如果是 符号 ,先与存符号的栈顶符号进行比较,若 优先级较大 则进栈,若 小于或等于 则栈顶出栈到后缀表达式的数组,此字符继续与现在的栈顶比较,进行循环操作;如果读到 左括号 ,则左括号直接进栈;如果读到 右括号 ,则符号依次退栈直到遇到左括号,左括号哪项也退栈,但不存入后缀表达式。 对后缀表达式计算就是依次扫描,扫描到符号,则符号前的两个数进行符号运算,直到扫描完。 接下来直接上代码 # include <stdio.h> # include <string.h> # define maxn 1005000 char s [ maxn ] ; //存中缀表达式 char s1 [ maxn ] ; //存后缀表达式的符号 char s2 [ maxn ] ; //存符号的栈 int a [ maxn ]

栈与队列

旧巷老猫 提交于 2020-02-21 19:37:30
目录 1 栈的定义 2 栈的顺序存储结构及实现 2.1 栈的顺序存储结构 2.2 栈的顺序存储结构--进栈出栈操作 3 两栈共享空间 4 栈的链式存储结构及实现 4.1 栈的链式存储结构--进栈操作 4.2 栈的链式存储结构--出栈操作 5 栈的应用--四则运算表达式求值 5.1 后缀表达式计算结果 5.2 中缀表达式转后缀表达式 6 队列的定义 7 循环队列 7.1 队列顺序存储 7.2 循环队列定义 8 队列的链式存储结构及实现 8.1 队列的链式存储结构--入队操作 8.2 队列的链式存储结构--出队操作 1 栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈,栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。 栈是一个线性表,栈元素具有线性关系,即前驱后继关系,栈的表尾是指栈顶,而不是栈底。栈底是固定的,最先进栈的只能在栈底,栈的插入操作,叫作进栈,栈的删除操作,叫作出栈。 2 栈的顺序存储结构及实现 2.1 栈的顺序存储结构 栈的顺序存储其实也是线性表存储的简化,称为顺序栈;线性表是用数组来实现的,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。 定义一个top变量指示栈顶元素在数组中的位置,若存储栈的长度为StackSize

UVA1103 古代象形符号 Ancient Messages解题报告(DFS,字符串)

百般思念 提交于 2020-02-19 03:24:12
题目翻译 为了识别3000年前古埃及用到的6种象形文字。每组数据包含一个H行W列的字符矩阵(H≤200,W≤50 ),每个字符为4个相邻像素点的十六进制(例如,10011100对应的字符就是9c)。转化为二进制后1表示黑点,0表示白点。输入满足以下条件: 不会出现上述6种符号之外的其他符号。 输入至少包含一个符号,且每个黑像素都属于一个符号。输入至少包含一个符号,且每个黑像素都属于一个符号。 每个符号都是一个四连块,并且不同符号不会相互接触,也不会相互包含。 如果两个黑像素有公共顶点,则它们一定有一个相同的相邻黑像素(有公共边)。 符号的形状一定和题中的图形拓扑等价(可以随意拉伸但不能拉断)。 要求按照字典序输出出现的所有符号。 输出说明: For each test case, display its case number followed by a string containing one character for each hieroglyph recognized in the image, using the following code: Ankh: A Wedjat: J Djed: D Scarab: S Was: W Akhet: K Sample Input 100 25 0000000000000000000000000

准备冲锋 golang入坑系列

蓝咒 提交于 2020-02-18 09:24:37
史前摘要: 本来想写读前必读,但连续几篇博文都写读前必读,感觉就没有了新意。 所以换成史前摘要,反正是一个意思。 此摘要的目的仍然是提醒点击而来的同学,本系列最新文章在 这里 。放到博客园的目的是为了方便不能翻墙的同学查看。 有人说写的太肤浅没意思,我的回答是,饭有粗茶咸淡,味有酸甜苦辣,萝卜青菜各有所爱。没辙,本人也就这点能耐了,耐看您就多看点,不耐看,呵呵,那我也改不了啦。 好,史前的话说完了,下面开始史后的话。 树活一张皮,人活一张脸。文章好不好,标题最重要。光起名就想了10几分钟,中国汉语博大精深,但适合做技术类标题的真心太难想了。标题不够,写诗来凑,所以来段绕口小段子算是开场: 守法朝朝忧闷,强盗夜夜欢歌。 损人利己骑马骡,正直公平却挨饿。 修桥补路瞎眼人,杀人放火事儿真多。我到西天问我佛,佛说:我TM也没辙。 看完,乐完。收拾心情,开始继续学Golang。 在上一节,你学会了写第一个Golang程序,也知道了Golang的程序结构。我不知道你是什么技术背景,也不知道有多少编码功底。所以有的地方写的比较啰嗦,懂了,就一笑而过。不懂,就好好看一下。知识多了,不丢人。不懂装懂,最可怕。 这一节,你将接触到Golang的基本数据类型。 自打有编程语言开始,基本类型就三类:布尔,字符/字符串,数值(和其它)。不同的语言,对类型有不同的分类标准,就会衍生出更为细致的分类

计算机的原码, 反码和补码

大憨熊 提交于 2020-02-17 01:45:48
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1] 原 = 0000 0001 [

计算机编程的各种数据类型及相关用法总结

╄→尐↘猪︶ㄣ 提交于 2020-02-17 01:42:29
总结归纳计算机编程中的各种数据类型,其表示形式和计算方法。重点关注类型转换、数值溢出和移位等操作。 数据类型 1.数字类型1.1 整数型(int)定义方式:如,phone_num=1371828137方法:加减乘除,地板除,取整,取余1.2 浮点型(float) 2.字符串类型(str)定义方式:在单引号,双引号,三单/双引号之间,但三单/双引号字符串可以换行 3.列表类型(list)定义:在[]中存任何数据类型的元素,这些元素以逗号隔开 4.字典类型(dict)定义方式:{}中以key:value的形式存储数据,key一般用来描述value的意义,所以key一般是字符串,但它可以是不可变数据类型;value可以是任何数据类型,以逗号隔开key:value 5.布尔类型(bool)定义:Ture/False注:0、None、空(空字符串,空列表,空字典),False的bool值为False。 6.用户交互 7.格式化输出 参考文献:https://www.cnblogs.com/bruce123/p/10796793.html 计算机中的类型转换在不同的编程系统中呈现不同,以下以C++为例进行说明: 一、在c++中的数据类型转换一般有以下几种情况: 1、将一种算术类型的值赋给另一种算术类型的变量时,c++将对值进行转换 2、表达式中包含不同的类型时,c++将对值进行转换 3

负数为什么要用补码来表示?

▼魔方 西西 提交于 2020-02-16 00:13:32
负数为什么要用补码来表示? 今天,发生一件非常有趣的事情。 公司同事问了我一个问题:为什么 2.0 - 1.1 = 0.89999999 呢?不应该是 0.9吗? 原来是,他问了周围一圈的同事,都给他的是同一个回答,说这是精度问题。他百思不得其解,怎么就会产生精度问题呢。再问,就没人知道原因了。 然后,我就看到了他抱着一本厚厚的书在看。拿过来一看,是一本Java书,厚厚的六百多页,这还仅是第一卷。哟呵,这是准备大干一场啊。 看在他这么努力学习的份上,还有他那对知识极度渴望的眼神。我决定,把我毕生所学传授与他。 于是,就给他详细讲解了,计算机中是怎么存储一个数的,十进制是怎么在转二进制的过程中丢失精度的,以及浮点数是怎么遵循IEEE 754 规范的,在浮点数进行加减运算的过程中会经历对阶、移位运算等过程,以及在此过程中是怎么丢失精度的。(这些问题在之前的文章中都有解答,参看“为什么0.1+0.2=0.30000000000000004”) 然后,成功的把他彻底搞懵逼了。怎么这么难啊。 原来,他的计算机基础比我还匮乏,不知道什么是位运算,不知道什么是原码、反码和补码。 本着我的热心肠,我就给他普及了一下这些知识 ---- 负数的补码形式和位移运算。 我们知道,一个数分为有符号和无符号。对于,有符号的数来说,最高位代表符号位,即最高位1代表负数,0代表正数。 在计算机中,存储一个数的时候