定点数

【讲古堂】浮点数

假如想象 提交于 2019-12-03 20:12:07
【 讲古堂 】 浮点数 ( dubenju@126.com 2015/12/19 ) 众所周知,由于用高低电平的电路很容易实现二进制,所以在计算机中普遍采用二进制来存储数据。对应的二进制的位用 Bit 来表示。 1 字节 =8Bits ,如果考虑符号的话,那么一个字节能存储的数值范围是 -128 到 127 。只能是整数,不能是小数。那么小数怎么办呢? 小数的话,一定要有小数点的。如果把小数点固定在一个不变的位置的话,就成了定点数。比如 Oracle 数据库的 NUMBER(4, 2) 则能存储 17.25 或 0.50 这样的数。 定点数 (Fixed Point Number) 所谓定点数,即约定数据的小数点位置是固定不变的。通常将定点数据表示成纯小数或纯整数。为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前;而为了把数表示成纯整数,则把小数点固定在数值部分的最后面。 对纯小数进行运算时,要用适当的比例因子进行折算,以免产生溢出,或过多损失精度。 假设用一个 n 位字来表示一个定点数 x= x0 x1 x2 … xn-1 ,其中一位 x0 用来表示数的符号位,其余位数代表它的量值。为了对所有 n 位进行统一处理,符号位 x0 通常放在最左位置,并用数值 0 和 1 分别代表正号和负号。对于任意定点数 x= x0 x1 x2 … xn-1 ,如果 x 表示的是纯小数

帧同步优化难点及解决方案

女生的网名这么多〃 提交于 2019-12-03 06:43:01
帧同步这部分比较复杂,细枝末节有很多优化点,也有一些不同的优化方向,根据不同项目类型、对操作手感的要求、联机玩家的个数等,会有不同的难点和痛点。不同的优化方向,优化手法的差异,可能导致一些争论。并且,帧同步,本身也有很多变种,以应对不同的需求。所以,本文一切都是基于作者的项目类型(ACT)来做的方案和优化,并不一定适合其它也需要帧同步的游戏,故在此提前说一下,以免引起一些不必要的误解。 帧同步的几个难点 帧同步的基础原理,以及和状态同步的区别,已经有很多文章介绍,我就不再赘述,大家可以自行google。以下只说几个难点。 保证客户端独自计算的正确,即一致性 帧同步的基础,是不同的客户端,基于相同的操作指令顺序,各自执行逻辑,能得到相同的效果。就如大家所知道的,在Unity引擎中,不同的调用顺序,时序,浮点数计算的偏差,容器的排序不确定性,Coroutine内写逻辑带来的不确定性,物理浮点数,随机数值带来的不确定性等等。 有些比较好解决,比如随机数值,只需要做随机种子即可。 有些需要注意代码规范,比如在帧同步的战斗中,逻辑部分不使用Coroutine,不依赖类似Dictionary等不确定顺序的容器的循环等。 还有最基础的,要通过一个统一的逻辑Tick入口,来更新整个战斗逻辑,而不是每个逻辑自己去Update。保证每次Tick都从上到下,每次执行的顺序一致。 物理方面

Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数

旧城冷巷雨未停 提交于 2019-12-02 16:21:12
Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数,因为 float, double等浮点的存储和操作(比如:相加,相减...)存在误差(7.22f - 7.0f = 0.21999979 而不是 0.22)。 下面以 BigDecimal 进行减法为例: /** * 精确的减法 */ public static double subtract(double v1, double v2) { BigDecimal d1 = new BigDecimal(Double.toString(v1)); BigDecimal d2 = new BigDecimal(Double.toString(v2)); return d1.subtract(d2).doubleValue(); } // subtract(7.22d, 7.0d) == 0.22 BigDecimal 提供了 add, divide, subtract 等一系列相关的 加、减、乘、除、取模 等操作。 来源: oschina 链接: https://my.oschina.net/u/59889/blog/510656

MYSQL中数据类型介绍

房东的猫 提交于 2019-11-30 02:57:37
一、MySQL的数据类型 主要包括以下五大类: 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型:FLOAT、DOUBLE、DECIMAL 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB 日期类型:Date、DateTime、TimeStamp、Time、Year 其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等 1、整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围(-2147483648~2147483647) bigint(m) 8个字节 范围(+-9.22*10的18次方) 取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为

漫谈计算机组成原理(九)定点数及定点数的运算

痴心易碎 提交于 2019-11-28 16:02:30
本文讲什么? 在计算机中,小数点并没有用专门的器件去表示,而是按照一种约定的方式,统一存储在寄存器单元中的。算数逻辑运算单元(ALU)是CPU的组成部分,负责算数和逻辑的运算。那么,ALU究竟是如何工作的呢? 这就是本文主要探讨的内容: 什么是定点数? 定点数的位移、加、减、乘、除运算是如何进行的? 定点数是啥? 从字面意思来理解,“定点数”就是“点”不动的数。那么究竟是什么“点”不动呢?没错,就是“小数点”。 在上一讲我们说道,不论是整数还是小数,都是有小数点的。 整数的小数点表示在最后一位数字的后面,而小数的小数点标识在真值的符号位后面。 如图所示: 除了定点数,还有一种数叫做“浮点数”,浮点数将在下一讲展开介绍。 定点数的运算 好了,介绍完定点数的基本概念以后,我们展开讲定点数的位移运算和四则运算。定点数的四则运算实际上要比我们想象的复杂的多。 机器并不像人,一眼就知道二二得四,他需要知道2的定点表示形式,然后两个定点数相乘,相乘是有一定的过程的,经过了这个过程,才能得到结果的二进制数,最终输出给我们。 我们要做的,就是了解加减乘除究竟经历了什么样子的过程 。 定点数的位移运算 不要看移位运算简单,但是它在计算机的运算中的地位是举足轻重的。没有移位运算,也就没有后面的乘除法,乘除法就是在移位运算和加减运算的配合下实现的。 移位运算的规则: 虽然正数和负数的移位运算规则不相同

关于小数计算引发的定点数思考

断了今生、忘了曾经 提交于 2019-11-28 16:02:02
在写CORIC算法实现代码的时候,遇到了小数问题如下: 、 第31行的代码如下: 这说明了写成小数形式,不会通过编译器的检查(暂且叫做编译器),编译器无法识别这种小数的表示方法。但我们又确实需要进行小数的计算,比如加法的; 比如1.4567+2.34789。编译都无法编译,那么该如何计算呢? 我们知道,比如编译器能够识别并计算145670+234789=380459。那么很自然的想到了将380459左移5位,不就得到我们想要的结果3.80459了吗? 这提供给了我们这样的一个原始的思路:将我们 要计算的数先扩大很多倍,变成整数,进行加减(假设也包括了乘除)运算,再将结果缩小同样的倍数,那么就得到我们要的结果。 即我们进行1.4567*10^5+2.34789*10^5=380459,再进行380459÷10^5.就得到了我们想要的结果。这已经是定点数表示的雏形了,但还不够完善,还需要解决两个问题: 1.我们究竟该乘10的多少次方?计算机的计算限制也不允许我们乘的太大了。假设我的计算机很low,只能×10^4.则会得到: 14567+23479=38046(注意,计算机可不会什么四舍五入,只会硬邦邦的算!),38046÷10^4=3.8046; 我们发现,由于计算机很low, 导致了我们的计算结果不够精确,但是和原来很接近!! 假设计算机更low,只能扩大10^3,发生了下面的事情:

定点数与浮点数区别

与世无争的帅哥 提交于 2019-11-28 16:01:42
最近做HDR时,经常要用NV提供的16位纹理,它的说明书16位能达到24位的精度,就很奇怪?一直搞不懂浮点数的精度怎么算的? 今天认真看了一下IEEE float point的标准,终于明白是什么了 1. 什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102 ,其中 1.2345 为尾数,10

定点数

梦想的初衷 提交于 2019-11-28 16:01:29
计算机中常用的数据表示格式有两种,一是定点格式,二是浮点格式。所谓定点数和浮点数,是指在计算机中一个数的小数点的位置是固定的还是浮动的:如果一个数中小数点的位置是固定的,则为定点数;如果一个数中小数点的位置是浮动的,则为浮点数。一般来说,定点格式可表示的数值的范围有限,但要求的处理硬件比较简单。而浮点格式可表示的数值的范围很大,但要求的处理硬件比较复杂。 采用定点数表示法的计算机称为定点计算机,采用浮点数表示法的计算机称为浮点计算机。定点机在使用上不够方便,但其构造简单,造价低,一般微型机和单片机大多采用定点数的表示方法。浮点机可表示的数的范围比定点机大得多,使用也比较方便,但是比定点机复杂,造价高,在相同的条件下浮点运算比定点运算速度慢。目前,一般大、中型计算机及高档微型机都采用浮点表示法,或同时具有定点和浮点两种表示方法。 所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。通常将定点数据表示成纯小数或纯整数。为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前;而为了把数表示成纯整数,则把小数点固定在数值部分的最后面,如图2-1所示。 图中所标示的小数点“.”,在机器中是不表示出来的,而是事先约定在固定的位置。对于一台计算机,一旦确定了小数点的位置就不再改变。 对纯小数进行运算时,要用适当的比例因子进行折算,以免产生溢出,或过多损失精度。

MySQL的数据类型

删除回忆录丶 提交于 2019-11-26 17:14:57
一、MySQL的数据类型 主要包括以下五大类: 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型:FLOAT、DOUBLE、DECIMAL 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB 日期类型:Date、DateTime、TimeStamp、Time、Year 其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等 1、整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围(-2147483648~2147483647) bigint(m) 8个字节 范围(+-9.22*10的18次方) 取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为

为什么JS中0.1+0.2 != 0.3

若如初见. 提交于 2019-11-26 13:47:06
首先我们先来看一个例子 console.log(0.1 + 0.2) // 结果是0.30000000000000004,而不是3 这里0.1 + 0.2 != 0.3 这个就是我们要解决的问题了。 要弄清这个问题的原因,首先我们需要了解下在计算机中数字是如何存储和运算的。在计算机中,数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的。在JS中数字采用的IEEE 754的双精度标准进行存储,我们可以无需知道他的存储形式,只需要简单的理解成就是存储一个数值所使用的二进制位数比较多而已,这样得到的数会更加精确。 这里为了简单直观,我们使用定点数来说明问题。在定点数中,如果我们以8位二进制来存储数字。 对于整数来说,十进制的35会被存储为: 00100011 其代表 2^5 + 2^1 + 2^0。 对于纯小数来说,十进制的0.375会被存储为: 0.011 其代表 1/2^2 + 1/2^3 = 1/4 + 1/8 = 0.375 而对于像0.1这样的数值用二进制表示你就会发现无法整除,最后算下来会是 0.000110011…由于存储空间有限,最后计算机会舍弃后面的数值,所以我们最后就只能得到一个近似值。在JS中采用的IEEE 754的双精度标准也是一样的道理,我们且不管这个标准下的存储方式跟定点数存储有何不同,单单在这一点上他们都是相同的,也就是存储空间有限