深入浅出浮点数

1. 什么是浮点数

在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。

 

它通常被表示成:

N = M* RE


  这里的M(Mantissa)被称为浮点数的尾数,R(Radix)被称为阶码的基数,E(Exponent)被称为阶的阶码。计算机中一般规定R为2、8或16、是一个确定的常数,不需要在浮点数中明确表示出来。因此,要表示浮点数,一是要给出尾数M的值,通常用定点小数形式表示,它决定了浮点数的表示精度,即可以给出的有效数字的位数。二是要给出阶码,通常用整数形式表示,它指出的是小数点在数据中的位置,决定了浮点数的表示范围。浮点数也要有符号位。在计算机中,浮点数通常被表示成如下格式:

   

MsEM

 

  Ms是尾数的符号位,即浮点数的符号位,安排在最高一位;
  E 是阶码,紧跟在符号位之后,占用m位,含阶码的一位符号;
  M 是尾数,在低位部分,占用n位。

 

2. IEEE 浮点数

      在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。

      这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。具体的格式参见下面的图例:

      在上面的图例中,第一个域为符号域。其中 0 表示数值为正数,而 1 则表示负数。

      第二个域为指数域,对应于我们之前介绍的二进制科学计数法中的指数部分。其中单精度数为 8 位,双精度数为 11 位。以单精度数为例,8 位的指数为可以表达 0 到 255 之间的 255 个指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为 127,而双精度数的偏差值为 1023。比如,单精度的实际指数值 0 在指数域中将保存为 127;而保存在指数域中的 64 则表示实际的指数值 -63。 偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -127 到 128 之间(包含两端)。我们不久还将看到,实际的指数值 -127(保存为 全 0)以及 +128(保存为全 1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -127 和 127 之间。在本文中,最小指数和最大指数分别用 eminemax 来表达。

      图例中的第三个域为尾数域,其中单精度数为 23 位长,双精度数为 52 位长。除了我们将要讲到的某些特殊值外,IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用 23 位长的尾数域表达了 24 位的尾数。比如对于单精度数而言,二进制的 1001.101(对应于十进制的 9.625)可以表达为 1.001101 × 23,所以实际保存在尾数域中的值为 00110100000000000000000,即去掉小数点左侧的 1,并用 0 在右侧补齐。

      值得注意的是,对于单精度数,由于我们只有 24 位的指数(其中一位隐藏),所以可以表达的最大指数为 224 - 1 = 16,777,215。特别的,16,777,216 是偶数,所以我们可以通过将它除以 2 并相应地调整指数来保存这个数,这样 16,777,216 同样可以被精确的保存。相反,数值 16,777,217 则无法被精确的保存。由此,我们可以看到单精度的浮点数可以表达的十进制数值中,真正有效的数字不高于 8 位。事实上,对相对误差的数值分析结果显示有效的精度大约为 7.22 位。参考下面的示例:

        true value                stored value--------------------------------------16,777,215                1.6777215E716,777,216                1.6777216E716,777,217                1.6777216E716,777,218                1.6777218E716,777,219                1.677722E716,777,220                1.677722E716,777,221                1.677722E716,777,222                1.6777222E716,777,223                1.6777224E716,777,224                1.6777224E716,777,225                1.6777224E7--------------------------------------

根据标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入。这有点像我们熟悉的十进制的四舍五入,即不足一半则舍,一半以上(包括一半)则进。不过对于二进制浮点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。从上面的示例中可以看出,奇数都被舍入为偶数,且有舍有进。我们可以将这种舍入误差理解为"半位"的误差。所以,为了避免 7.22 对很多人造成的困惑,有些文章经常以 7.5 位来说明单精度浮点数的精度问题。

提示: 这里采用的浮点数舍入规则有时被称为舍入到偶数(Round to Even)。相比简单地逢一半则进的舍入规则,舍入到偶数有助于从某些角度减小计算中产生的舍入误差累积问题。因此为 IEEE 标准所采用。

3. 实数和浮点数之间的变换

现在我们已经明白了浮点数的 IEEE 表达方式。我们来做些实数和浮点数之间的变换练习以加深理解。在这些练习中,你还会发现一些围绕浮点数运算的令人吃惊的事实。

首先我们来看看事情简单的一面,从浮点数变换到实数。理解了浮点数的格式,做这个练习并不难。假定我们有一个 32 位的数据,用十六进制表示为 0xC0B40000,并且我们知道它实际上是一个单精度的浮点数。为了得到该浮点数实际表达的实数,我们首先将它变换为二进制形式:

  C    0    B    4    0    0    0    0
1100 0000 1011 0100 0000 0000 0000 0000

接着按照浮点数的格式切分为相应的域:

1  10000001 01101000000000000000000

符号域 1 意味着负数;指数域为 129 意味着实际的指数为 2 (减去偏差值 127);尾数域为 01101 意味着实际的二进制尾数为 1.01101 (加上隐含的小数点前面的 1)。所以,实际的实数为:

-1.01101 × 2
2
-(2
0
 + 2
-2
 + 2
-3
 2
-5
) × 2
2
-5.625

从实数向浮点数变换稍微麻烦一点。假定我们需要将实数 -9.625 表达为单精度的浮点数格式。方法是首先将它用二进制浮点数表达,然后变换为相应的浮点数格式。

首先,将小数点左侧的整数部分变换为其二进制形式,9 的二进制性形式为 1001。处理小数部分的算法是将我们的小数部分乘以基数 2,记录乘积结果的整数部分,接着将结果的小数部分继续乘以 2,并不断继续该过程:

0.625 × 2 = 1.25        1
0.25  × 2 = 0.5         0
0.5   × 2 = 1           1
0

当最后的结果为零时,结束这个过程。这时右侧的一列数字就是我们所需的二进制小数部分,即 0.101。这样,我们就得到了完整的二进制形式 1001.101。用规范浮点数表达为 1.001101 × 23

因为是负数,所以符号域为 1。指数为 3,所以指数域为 3 + 127 = 130,即二进制的 10000010。尾数省略掉小数点左侧的 1 之后为 001101,右侧用零补齐。最终结果为:

1 10000010 00110100000000000000000

最后可以将浮点数形式表示为十六进制的数据如下:

1100 0001 0001 1010 0000 0000 0000 0000C    1    1    A    0    0    0    0

最终结果为 0xC11A0000。

很简单?等等!你可能已经注意到了,在上面这个我们有意选择的示例中,不断的将产生的小数部分乘以 2 的过程掩盖了一个事实。该过程结束的标志是小数部分乘以 2 的结果为 1,不难想象,很多小数根本不能经过有限次这样的过程而得到结果(比如最简单的 0.1)。我们已经知道浮点数尾数域的位数是有限的,为此,浮点数的处理办法是持续该过程直到由此得到的尾数足以填满尾数域,之后对多余的位进行舍入。换句话说,除了我们之前讲到的精度问题之外,十进制到二进制的变换也并不能保证总是精确的,而只能是近似值。事实上,只有很少一部分十进制小数具有精确的二进制浮点数表达。再加上浮点数运算过程中的误差累积,结果是很多我们看来非常简单的十进制运算在计算机上却往往出人意料。这就是最常见的浮点运算的"不准确"问题。参见下面的 Java 示例:

System.out.print("34.6-34.0=" + (34.6f-34.0f));

这段代码的输出结果如下:

34.6-34.0=0.5999985

产生这个误差的原因是 34.6 无法精确的表达为相应的浮点数,而只能保存为经过舍入的近似值。这个近似值与 34.0 之间的运算自然无法产生精确的结果。

 

4. 特殊值

通过前面的介绍,你应该已经了解的浮点数的基本知识,这些知识对于一个不接触浮点数应用的人应该足够了。不过,如果你兴趣正浓,或者面对着一个棘手的浮点数应用,可以通过本节了解到关于浮点数的一些值得注意的特殊之处。

我们已经知道,指数域实际可以表达的指数值的范围为 -127 到 128 之间(包含两端)。其中,值 -127(保存为 全 0)以及 +128(保存为全 1)保留用作特殊值的处理。本节将详细 IEEE 标准中所定义的这些特殊值。

浮点数中的特殊值主要用于特殊情况或者错误的处理。比如在程序对一个负数进行开平方时,一个特殊的返回值将用于标记这种错误,该值为 NaN(Not a Number)。没有这样的特殊值,对于此类错误只能粗暴地终止计算。除了 NaN 之外,IEEE 标准还定义了 ±0,±∞ 以及非规范化数(Denormalized Number)。

对于单精度浮点数,所有这些特殊值都由保留的特殊指数值 -127 和 128 来编码。如果我们分别用 eminemax 来表达其它常规指数值范围的边界,即 -126 和 127,则保留的特殊指数值可以分别表达为 emin - 1 和 emax + 1; 。基于这个表达方式,IEEE 标准的特殊值如下所示:

其中 f 表示尾数中的小数点右侧的(Fraction)部分。第一行即我们之前介绍的普通的规范化浮点数。随后我们将分别对余下的特殊值加以介绍。

4.1. NaN

NaN 用于处理计算中出现的错误情况,比如 0.0 除以 0.0 或者求负数的平方根。由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为 emax + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾数域的值来表达 NaN,比如 Java 中的常量 Float.NaN 的浮点数可能表达为 01111111110000000000000000000000,其中尾数域的第一位为 1,其余均为 0(不计隐藏的一位),但这取决系统的硬件架构。Java 中甚至允许程序员自己构造具有特定位模式的 NaN 值(通过 Float.intBitsToFloat() 方法)。比如,程序员可以利用这种定制的 NaN 值中的特定位模式来表达某些诊断信息。

定制的 NaN 值,可以通过 Float.isNaN() 方法判定其为 NaN,但是它和 Float.NaN 常量却不相等。实际上,所有的 NaN 值都是无序的。数值比较操作符 <,<=,> 和 >= 在任一操作数为 NaN 时均返回 false。等于操作符 == 在任一操作数为 NaN 时均返回 false,即使是两个具有相同位模式的 NaN 也一样。而操作符 != 则当任一操作数为 NaN 时返回 true。这个规则的一个有趣的结果是 x!=x 当 x 为 NaN 时竟然为真。

可以产生 NaN 的操作如下所示:

此外,任何有 NaN 作为操作数的操作也将产生 NaN。用特殊的 NaN 来表达上述运算错误的意义在于避免了因这些错误而导致运算的不必要的终止。比如,如果一个被循环调用的浮点运算方法,可能由于输入的参数问题而导致发生这些错误,NaN 使得 即使某次循环发生了这样的错误,也可以简单地继续执行循环以进行那些没有错误的运算。你可能想到,既然 Java 有异常处理机制,也许可以通过捕获并忽略异常达到相同的效果。但是,要知道,IEEE 标准不是仅仅为 Java 而制定的,各种语言处理异常的机制不尽相同,这将使得代码的迁移变得更加困难。何况,不是所有语言都有类似的异常或者信号(Signal)处理机制。

注意: Java 中,不同于浮点数的处理,整数的 0 除以 0 将抛出 java.lang.ArithmeticException 异常。

4.2. 无穷

和 NaN 一样,特殊值无穷(Infinity)的指数部分同样为 emax + 1 = 128,不过无穷的尾数域必须为零。无穷用于表达计算中产生的上溢(Overflow)问题。比如两个极大的数相乘时,尽管两个操作数本身可以用保存为浮点数,但其结果可能大到无法保存为浮点数,而必须进行舍入。根据 IEEE 标准,此时不是将结果舍入为可以保存的最大的浮点数(因为这个数可能离实际的结果相差太远而毫无意义),而是将其舍入为无穷。对于负数结果也是如此,只不过此时舍入为负无穷,也就是说符号域为 1 的无穷。有了 NaN 的经验我们不难理解,特殊值无穷使得计算中发生的上溢错误不必以终止运算为结果。

无穷和除 NaN 以外的其它浮点数一样是有序的,从小到大依次为负无穷,负的有穷非零值,正负零(随后介绍),正的有穷非零值以及正无穷。除 NaN 以外的任何非零值除以零,结果都将是无穷,而符号则由作为除数的零的符号决定。

回顾我们对 NaN 的介绍,当零除以零时得到的结果不是无穷而是 NaN 。原因不难理解,当除数和被除数都逼近于零时,其商可能为任何值,所以 IEEE 标准决定此时用 NaN 作为商比较合适。

4.3. 有符号的零

因为 IEEE 标准的浮点数格式中,小数点左侧的 1 是隐藏的,而零显然需要尾数必须是零。所以,零也就无法直接用这种格式表达而只能特殊处理。

实际上,零保存为尾数域为全为 0,指数域为 emin - 1 = -127,也就是说指数域也全为 0。考虑到符号域的作用,所以存在着两个零,即 +0 和 -0。不同于正负无穷之间是有序的,IEEE 标准规定正负零是相等的。

零有正负之分,的确非常容易让人困惑。这一点是基于数值分析的多种考虑,经利弊权衡后形成的结果。有符号的零可以避免运算中,特别是涉及无穷的运算中,符号信息的丢失。举例而言,如果零无符号,则等式 1/(1/x) = x 当x = ±∞ 时不再成立。原因是如果零无符号,1 和正负无穷的比值为同一个零,然后 1 与 0 的比值为正无穷,符号没有了。解决这个问题,除非无穷也没有符号。但是无穷的符号表达了上溢发生在数轴的哪一侧,这个信息显然是不能不要的。零有符号也造成了其它问题,比如当 x=y 时,等式1/x = 1/y 在 x 和 y 分别为 +0 和 -0 时,两端分别为正无穷和负无穷而不再成立。当然,解决这个问题的另一个思路是和无穷一样,规定零也是有序的。但是,如果零是有序的,则即使 if (x==0) 这样简单的判断也由于 x 可能是 ±0 而变得不确定了。两害取其轻者,零还是无序的好。

4.4. 非规范化数

我们来考察浮点数的一个特殊情况。选择两个绝对值极小的浮点数,以单精度的二进制浮点数为例,比如 1.001 × 2-125 和 1.0001 × 2-125 这两个数(分别对应于十进制的 2.6448623 × 10-38 和 2.4979255 × 10-38)。显然,他们都是普通的浮点数(指数为 -125,大于允许的最小值 -126;尾数更没问题),按照 IEEE 754 可以分别保存为 00000001000100000000000000000000(0x1100000)和 00000001000010000000000000000000(0x1080000)。

现在我们看看这两个浮点数的差值。不难得出,该差值为 0.0001 × 2-125,表达为规范浮点数则为 1.0 × 2-129。问题在于其指数大于允许的最小指数值,所以无法保存为规范浮点数。最终,只能近似为零(Flush to Zero)。这中特殊情况意味着下面本来十分可靠的代码也可能出现问题:

if (x != y) {z = 1 / (x -y);
}

正如我们精心选择的两个浮点数展现的问题一样,即使 x 不等于 y,x 和 y 的差值仍然可能绝对值过小,而近似为零,导致除以 0 的情况发生。

为了解决此类问题,IEEE 标准中引入了非规范(Denormalized)浮点数。规定当浮点数的指数为允许的最小指数值,即 emin 时,尾数不必是规范化的。比如上面例子中的差值可以表达为非规范的浮点数 0.001 × 2-126,其中指数 -126 等于 emin。注意,这里规定的是"不必",这也就意味着"可以"。当浮点数实际的指数为 emin,且指数域也为 emin 时,该浮点数仍是规范的,也就是说,保存时隐含着一个隐藏的尾数位。为了保存非规范浮点数,IEEE 标准采用了类似处理特殊值零时所采用的办法,即用特殊的指数域值 emin - 1 加以标记,当然,此时的尾数域不能为零。这样,例子中的差值可以保存为 00000000000100000000000000000000(0x100000),没有隐含的尾数位。

有了非规范浮点数,去掉了隐含的尾数位的制约,可以保存绝对值更小的浮点数。而且,也由于不再受到隐含尾数域的制约,上述关于极小差值的问题也不存在了,因为所有可以保存的浮点数之间的差值同样可以保存。

 

原文地址:http://blog.csdn.net/cppptr/article/details/573372(有修改)

转载于:https://www.cnblogs.com/ImaY/p/3955547.html

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

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

相关文章

深度解析2019中国机器人行业年会主旨报告:把脉中国机器人发展,助力产业创新与协作共融...

来源&#xff1a;机器人大讲堂摘要&#xff1a;1月10日&#xff0c;由机器人大讲堂联合主办的2019中国机器人行业年会在北京盛大开幕。2018年经济下行趋势明显&#xff0c;迫使我们能沉下心来面对之前异常火爆的机器人市场&#xff0c;整个行业开始变得跌跌撞撞&#xff0c;很多…

如何防止基因编辑技术突破底线:警惕科学狂人再现

作者&#xff1a;胡丹萍 吴跃伟 刘楚来源&#xff1a;澎湃新闻从前隅于学界的基因编辑一词&#xff0c;在2018年&#xff0c;有如一声惊雷传入寻常百姓家。DNA和基因是生物体的核心代码&#xff0c;使用一组生物分子像剪刀或橡皮一样精确地改变基因序列即基因编辑技术。几十年来…

opencv简单的矩阵操作

OpenCV的基本矩阵操作与示例 OpenCV中的矩阵操作非常重要&#xff0c;本文总结了矩阵的创建、初始化以及基本矩阵操作&#xff0c;给出了示例代码&#xff0c;主要内容包括&#xff1a; 创建与初始化矩阵加减法矩阵乘法矩阵转置矩阵求逆矩阵非零元素个数矩阵均值与标准差矩阵全…

中科院院士丁汉:数字化制造、机器人、人工智能是智能制造 “三驾马车”

丁汉院士演讲1月10日&#xff0c;由中国机电一体化技术应用协会、北京理工大学智能机器人与系统高精尖创新中心、中关村智友天使学院、机器人大讲堂(立德共创服务平台)、中关村融智特种机器人产业联盟和中关村信息谷等单位共同举办的2019年中国机器人行业年会在北京召开。会上&…

图像拼接---图片柱面投影简单实现

算法思想参考&#xff1a;http://blog.csdn.net/weixinhum/article/details/50611750 柱面投影是图片拼接的前期的一部分工作&#xff0c;以下代码只是简单的实现了投影&#xff0c;还可以优化&#xff0c; 柱面半径设置位图片宽度的一半&#xff0c;即 R width/2 代码运算…

从消费端到企业端,从设备到数据:物联网市场的爆发式增长

来源&#xff1a;资本家实验室随着越来越多的设备接入网络&#xff0c;并实现相互沟通&#xff0c;我们正在加速进入“万物互联”的时代。在此背景下&#xff0c;连接设备的数量、产生的收入和数据量也将呈现惊人的增长&#xff1a;到2020年&#xff0c;全球连接设备数量将达到…

《LoadRunner 没有告诉你的》之四——理解性能

本文是《LoadRunner没有告诉你的》系列文章的第四篇&#xff0c;在这篇短文中&#xff0c;我将尽可能用简洁清晰的文字写下我对“性能”的看法&#xff0c;并澄清几个容易混淆的概念&#xff0c;帮助大家更好的理解“性能”的含义。 如何评价性能的优劣: 用户视角 vs. 系统视角…

容斥原理---概念介绍

容斥原理---概念介绍 容斥原理是一种基本的计数工具。 假设我们有N个对象的集合A&#xff0c;设a1, a2,…, ar是这些对象可能有的性质的集合&#xff0c;设N(ai )是有性质ai的对象数目。一个对象可能有若干个所讨论的性质&#xff08;或一个性质也没有&#xff09;。设N(a’i …

c#自动更新+安装程序的制作

一、自动更新的实现 让客户端实现自动更新&#xff0c;通常做法是在客户端部署一个单独的自动更新程序。主程序启动后&#xff0c;访问服务端&#xff0c;检查配置文件是否有更新版本&#xff0c;有更新版本就启动更新程序&#xff0c;由更新负责下载更新版本&#xff0c;并更新…

中国AI科研产出全球第一 但引文影响力低

来源&#xff1a;科学网 日前&#xff0c;爱思唯尔发布了《人工智能&#xff1a;知识的创造、转移与应用》报告&#xff0c;分析了全球人工智能科研的发展趋势。报告显示&#xff0c;2017年中国在人工智能领域出版的文章数量位列全球第一&#xff0c;科研产出已在2004年超过美国…

OpenCV--SIFT算法检测特征点

代码选自&#xff1a;http://blog.csdn.net/zhaocj/article/details/42124473 SIFT算法是用来检测图像中特征点的&#xff0c; 代码如下&#xff1a; opencv版本:2.4.9 #include "opencv2/opencv.hpp" #include "opencv2/imgproc/imgproc.hpp" #include…

对话 Geoffrey Hinton Demis Hassabis :人工智能离我们有多远?

来源&#xff1a;AI科技评论预测用户喜欢的音乐类型、检测出转移性肿瘤、生成脑癌的综合扫描、利用真实世界中拍摄的视频创造出虚拟环境、识别出被拐卖的人口、击败国际象棋大师以及专业的 Dota2 电竞团队、帮助 Alphabet 旗下的 Waymo 首次推出商业无人驾驶出租车服务、代替出…

SharePoint 2013 关于自定义显示列表表单的bug

1、在SharePoint 2013中&#xff0c;我们隐藏列表Dispform页面的ListFormWebPart部件&#xff0c;转而使用自定义显示列表表单进行展示&#xff0c;因为这样更容易定制我们需要的显示&#xff1b; 2、之后发现文件夹下的文档&#xff0c;查看属性会报错&#xff0c;如下图&…

SIFT算法中概念简单解释

尺度空间 真实世界的物体只有在一定尺度上才有意义&#xff0c;例如我们能够看到放在桌子上的水杯&#xff0c;但对于整个银河系&#xff0c;这个水杯是不存在的。物体的这种多尺度的本质在自然界中是普遍存在的。尺度空间就是试图在数字图像领域复制这个概念。又比如&#xf…

发布|CES 2019 科技趋势(附40页PPT)

来源&#xff1a;Robot未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff…

UVAL - 6755 - Swyper Keyboard

先上题目&#xff1a; https://icpcarchive.ecs.baylor.edu/external/67/6755.pdf 题目复制起来比较麻烦。 题意&#xff1a;定义一种操作&#xff1a;给出一个字符串&#xff0c;然后手指就按照给出的字符串的字符出现顺序不离开触摸屏那样移动&#xff0c;这样最后就会得到一…

Ransac算法简介

给定两个点p1与p2的坐标&#xff0c;确定这两点所构成的直线&#xff0c;要求对于输入的任意点p3&#xff0c;都可以判断它是否在该直线上。初中解析几何知识告诉我们&#xff0c;判断一个点在直线上&#xff0c;只需其与直线上任意两点点斜率都相同即可。实际操作当中&#xf…

2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势

来源&#xff1a;网络大数据1、简介过去几年一直是人工智能爱好者和机器学习专业人士最幸福的时光。因为这些技术已经发展成为主流&#xff0c;并且正在影响着数百万人的生活。各国现在都有专门的人工智能规划和预算&#xff0c;以确保在这场比赛中保持优势。数据科学从业人员也…

仿射变换的原理

在条形码识别软件中有图像预览的功能。有时预览的图像需要进行转置&#xff08;旋转180度或者90度&#xff09;、缩放、镜像&#xff08;左右反转&#xff09;等操作。OpenCV提供了相应的函数进行以上操作。例如&#xff1a; 转置&#xff1a;cv::WarpAffine() 缩放&#xff…

拯救顽疾大作战!IDC绘中国医疗AI生态图谱,英伟达献医疗影像新杀器

来源&#xff1a;智东西摘要&#xff1a;中国千家医院部署AI系统&#xff01;IDC医疗AI报告详解行业趋势和五大药方。2018年是令人唏嘘的一年&#xff0c;台湾作家李敖、动画大师高畑勋、相声表演艺术家师胜杰、央视主持人李咏、微软联合创始人保罗艾伦、武侠小说宗师金庸等一个…