学习
实践
活动
专区
工具
TVP
写文章

浮点运算

所有使用 IEEE 754 标准的编程语言,都存在浮点运算的精度问题,不论是 C/C++、Java、Ruby,还是 Go、Python,当然 JavaScript/Node.js 也是如此。 01 — 问题 以下是浮点数常见运算出现问题的示例: 0.1 + 0.2 = 0.30000000000000004 0.3 - 0.1 = 0.09999999999999998 02 — 解决 一般解决上述运算精度问题的主要思想是通过将浮点运算转化为整数运算。 一、直接扩大缩小倍数 比如: ( 0.1 * 10 + 0.2 * 10 ) / 10 = 0.3 这种方式乍一看好像是转化成了整数运算,但其实也是存在问题的,因为其扩大倍数的时候仍然是浮点运算, 二、通过检测小数的位数转换为整数 上一种方式的软肋在于转换为整数的过程仍然是浮点运算,然而这种完全是可以通过另一种途径解决。

30310

浮点运算丢失精度

浮点运算丢失精度 今天碰到了这样一个情况, 使我又去翻阅了原来课本, 在Pthon中如果输入下面这段程序: print(sys.float_info.max - 1.0) print(sys.float_info.max 这种方式的前提是需要确切的知道小数的位数, 但是好在精度高, 在运算的时候不会造成误差. 比较适合保存金额等. 在两个浮点数进行运算的时候, 要先将指数部分保持一致, 然后再进行相应的运算, 也就是说: 1.0*10^4 + 1.0*10^2 要转换成: 1.0*10^4 + 0.01*10^4 如此, 上面的最大值 所以, 要将浮点数1.0进行转换, 而这个数字要想转换成相同指数的话, 其基数部分就要后移1023位, 导致溢出, 就变成0了. 所以就相当于和0做运算, 其结果不变. 如此说来, 小数在两个相差很多的数字之间进行运算的时候, 也容易导致丢失精度.

27120
  • 广告
    关闭

    热门业务场景教学

    个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    浮点数的运算精度丢失

    解惑 其实这设计到了计算机的浮点数存储是以二进制进行存储的。 十进制的0.1,转换成二进制是:0.00011001100110011无限循环的小数,所以二进制的小数运算,就会出现上面的1/3+1/3的情况,无法精确计算,只能够近似表示。 :0.00011001 (再反转回十进制,就会发现精度的丢失了,十进制是:0.09765625) 十进制的0.2,转换成二进制为:0.00110011 (反转回十进制,为:0.19921875) 加法运算 十进制 0.1+0.2=0.3 二进制 0.00011001+0.00110011=0.01001100 (转成十进制:0.296875) ---- 当然,计算机中存储的位数要比8位多,python浮点数占用 当然,这个0.3也不是精确的0.3,但会在显示过程进行精度转换,通过整数运算,避免了小数运算过程中的丢失精度问题。

    1K10

    浅谈linux kernel对于浮点运算的支持

    目前大多数CPU都支持浮点运算单元FPU,FPU作为一个单独的协处理器放置在处理器核外,但是对于嵌入式处理器,浮点运算本来就少用,有些嵌入式处理器就会去掉浮点协处理器。 ,软浮点含义是有gcc编译器模拟浮点运算(glibc库提供),将浮点运算代码替换为定点运算。 将kernel编译为硬浮点,也就是让处理器的浮点指令计算浮点, 硬浮点运算肯定要比模拟的定点运算效率高。 (kernel代码中一般不会有浮点运算,所以效率影响不大) 2 对于运行在kernel上的app来说,特别是对于图形程序,如QT,浮点运算较多,我们直接编译即可,因为处理器支持浮点运算,支持浮点运算指令 在接FPU后,处理器核内就要屏蔽掉浮点异常,不然浮点运算还是产生浮点异常,FPU就没有实用意义了。

    1.2K30

    PHP使用BC Math 函数处理浮点运算问题

    BC Math 函数 http://cn.php.net/manual/zh/ref.bc.php 做小数的相加减问题是,出现了浮点运算不准的情况,看来都说解释型语言对于浮点运算都会有问题的说法是真的 PHP手册对于浮点数有以下警告信息: Warning 浮点数精度 显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。 所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数 那么上面的算式我们应该改写为 <? php $a = 0.1; $b = 0.7; var_dump(bcadd($a,$b,2) == 0.8); 这样就能解决浮点数的计算问题了 本文由来源 21aspnet,由 javajgs_com

    24520

    double浮点运算为啥会丢失精度?

    1.浮点数是啥? 浮点数是计算机用来表示小数的一种数据类型,采用科学计数法。在java中,double是双精度,64位,浮点数,默认是0.0d。 其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。 3.走进失真之精度 计算机在处理数据都涉及到数据的转换和各种复杂运算,比如,不同单位换算,不同进制(如二进制十进制)换算等,很多除法运算不能除尽,比如10÷3=3.3333.....无穷无尽,而精度是有限的 需要将0.3转成二进制在运算 0.3 * 2 = 0.6 => .0 (.6)取0剩0.6 0.6 * 2 = 1.2 => .01 (.2)取1剩0.2 0.2 * 2 = 0.4 => .010 简单来说float和double类型主要是为了科学计算和工程计算而设计,他们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近和计算而精心设计的。

    2.3K20

    浮点数加减运算左规右规

    当尾数用二进制表示时,浮点规格化的定义是尾数M应满足:                            1/2   ≤  |M|<1 显然对于正数而言,有M = 00.1φφ…φ;对于负数,其补码形式为 这样,当进行补码浮点加减运算时,只要对运算结果的符号位和小数点后的第一位进行比较:如果它们不等,即为00.1φφ…φ或11.0φφ…φ,就是规格化的数;如果它们相等,即为00.0φφ…φ或11.1φφ… 在浮点加减运算时,尾数求和的结果也可以得到01.φφ…φ或10.φφ…φ,即两符号位不相等,在这定点加减运算中称为溢出,是不允许的。但在浮点运算中,它表明尾数求和结果的绝对值大于1,向左破坏了规格化。 此时将尾数运算结果右移以实现规格化表示,称为向右规格化,即尾数右移1位,阶码加1。 【例 】 设x=2010×0.11011011,y=2100×(-0.10101100),求x+y。 [解:] 为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位,则它们的 浮点表示分别为 [x]浮=00 010,  0.11011011 [y]浮=00 100,  1.01010100

    9210

    Nodejs学习笔记(十七)--- 浮点运算decimal.js

    前言  开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰  JavaScript 只有一种数字类型 ( Number )  JavaScript采用 IEEE 754 标准双精度浮点 (64),64位中 1位浮点数中符号,11存储指数,52位存储浮点数的有效数字  有时候小数在二进制中表示是无限的,所以从53位开始就会舍入(舍入规则是0舍1入),这样就造成了“浮点精度问题”(由于舍入规则有时大点 ()); //减法 var a = 1.0; var b = 0.7 console.log('直接减法运算 a - b =', a - b); console.log('Decimal.js减法运算 ()); //除法 var a = 0.029; var b = 10; console.log('直接除法运算 a / b =', a / b); console.log('Decimal.js除法运算 说明: “浮点问题”不算是问题,它一直就是这样,也不是JavaScript独有的, 所以这个锅不应该它背^_^!

    1.6K70

    浅谈float浮点型的底层存储与运算

    1、无中生“友” 2、浮点型数据介绍 3、浮点数的表示形式 3.1 浮点数转换为二进制 3.2 科学计数法表示二进制数 3.3 存储科学计数法表示的二进制 4、如何精确的表示浮点数 1、无中生“ 日常程序开发并不只是用到整数,反而在多数情况下,我们用到的都是实数(有理数和无理数的集合) 实数之间的运算浮点运算浮点运算不像整数运算,它的计算结果一般是不确定的。 一块芯片上的浮点计算结果也许与另一块芯片上的不同 部分文字内容来源于大学时的计算机基础课程《计算机组成原理》 3、浮点数的表示形式 浮点型的科学计数法表示:N=M*rE M称为浮点数的尾数,M取小数 ,可正可负 E称为浮点数的指数,也叫阶码,E取整数,可正可负 r称为浮点数的基数,计算机中r取2、4、8、16等 浮点数在计算机中的表示,有一个IEEE的标准,它定义了两个基本的格式: 一个是用32比特表示单精度的浮点数 ,也就是我们常常说的float 另外一个是用64比特表示双精度的浮点数,也就是我们平时说的 double 在计算机中都是用二进制存储,因此不论是32位浮点数还是64位浮点数,由于基数2是固定常数,对每一个浮点数都一样

    53610

    Unixbench浮点运算性能压测有坑!

    image.png 经过一顿排查,最后发现: (1)睿频会提高 CPU 浮点等纯计算的性能,但是提高得不多,约 10%~20% 左右,而且可能和负载有一定关系; (2)上述问题的本质是因为 Whetstone 初步测试和分析 由于这些指标涉及的是 CPU 浮点计算性能,通过 perf 和火焰图分析,性能瓶颈不在内核态,用户态也没有异常的热点。 image.png image.png 这里就有疑问了,按理说,参与运算的 CPU 主频越高,性能应该会更好才对,那为什么在 C0C1C6 上实测的 Whetstone 却给出了较低的分数呢? 和压测函数的耗时,得出一个比率即为 CPU 的浮点计算性能值。 xtra 的取值特点是:随着预估频率的增大而增大,目的是在一个足够宽的时间段内,压测出一个相对稳定可靠的浮点计算性能值。下图就是作者的注释(居然是在奔腾系列的测试例子,这年代有点久远哈)。

    1.5K30

    疑难杂症小记 - 浮点运算的精度问题

    这里一步步的讲下,算作笔记了~ 二进制小数无法精确表达十进制小数 拿上面的 test 为例,虽然代码中我们将他初始化为了十进制小数 1.3f, 但实际上,由于二进制小数无法精确表达十进制小数 1.3f, 所以浮点数 (细节来讲, test 的二进制表示为 0 01111111 01001100110011001100110,实际表示的数值为 1.29999995231628) 浮点数乘法可能是以高精度执行的 考虑上面的代码 float result = num * test, 实际的运算过程可能是在 double 精度下(或者更高精度下)进行的,翻译成代码,大概是这个样子: float result = (float)( 0 10000110 10100000000000000000000 (即208) 浮点数转整数采用的是截断方式 承接上面的说明, 我们计算出了高精度下的乘法数值 (double)num * (double 因为 1.3 的实际二进制表示为 1.29999995231628,与 160 相乘后结果为 207.9999923706048,转换为浮点数是采用了近似方式,得到了208,之后再转化为整数自然仍然是

    24121

    系统的讲解 - PHP 浮点数高精度运算

    关于 PHP 浮点运算,特别是金融行业、电子商务订单管理、数据报表等相关业务,利用浮点数进行加减乘除时,稍不留神运算结果就会出现偏差,轻则损失几十万,重则会有信誉损失,甚至吃上官司,我们一定要引起高度重视 浮点运算的“锅” //加 $a = 0.1; $b = 0.7; $c = intval(($a + $b) * 10); echo $c." 非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。 小结 通过浮点数精度的问题,了解到浮点数的小数用二进制的表示。 分享了用 PHP 任意精度数学函数,来进行高精度运算。 以后,在使用浮点运算的时候,一定要慎之又慎,细节决定成败。 原文地址 https://mp.weixin.qq.com/s/gUlnmG0m7c_Oc2fKVyWFBQ

    1K40

    计算卷积神经网络浮点运算

    前言 本文主要是介绍了,给定一个卷积神经网络的配置之后,如何大概估算它的浮点运算量。 那么对于给定一个卷积神经 网络的模型定义,该如何估算其浮点运算量,对于卷积神经网络来说,卷积层的运算量是占网络 总运算量的大头,而对于一些像素级别任务,反卷积层也要算上,而全连接的权值大小是占网络 权值的大头 ,运算量也有些。 网络各层运算量计算方法 卷积层运算量 对于卷积层来说,计算运算量的话其实很简单,因为卷积层的操作其实可以改写为矩阵乘法, 这个思想很经典了,把输入的feature map通过im2col操作生成一个矩阵 反卷积层运算量 反卷积其实也叫做转置卷积,其正反向传播,和卷积的正反向刚好相反。 其运算量还是用画个图好解释。

    1.8K40

    浮点运算为什么不准?有人为0.30000000000000004建了个网站

    新智元报道 编辑:鹏飞 【新智元导读】计算机浮点运算会出现一定程度的不准确性,通常是.1 + .2!= .3。这个网站解释了为什么计算机会出现这样的情况,以及各种语言出现的不同结果,引发读者热议。 浮点运算是计算机基本运算,但是会因为使用的编程语言不同而出现一些奇特的现象。来新智元 AI 朋友圈和AI大咖一起讨论吧~ 浮点运算一直非常玄学。 你会发现,使用double或者float得出的计算结果,总是跟我们的预期有一点点差距,这就使得浮点运算容易让人觉得“不精确”。 实际上,因为我们人类理解的数字是十进制,而计算机理解的数字是二进制。 有人因此建立了一个网站: https://0.30000000000000004.com/ 正是因为浮点运算的精度问题,使得其无法应用在像银行这样对数字极度敏感的场景中。 但浮点运算可以表示比的范围比整数更大、在大数运算中也更有优势,它天生是为表示超大数或者无限值。因此在类似图神经网络这种注重数量大于精度的场景下,才是浮点运算大显身手的地方。

    3.6K20

    代码还原的技术: Unidbg调试浮点运算(一)

    它们就是传说中的浮点运算,今天我们来点亮一个很有用的技能树: Unidbg调试浮点运算 二、步骤 先写个floatdemo 有这么一个祖传的算法函数。 IDA一把 [floatone.png] 可以看出两个区别, 一个是寄存器不一样,普通运算使用的寄存器是R0-Rx,浮点运算使用的是D0-Dx (其实还有 S0-Sx),另一个是指令不一样,普通运算是 MOV、MUL,而浮点运算使用的是VMOV,VMUL,感觉就是普通运算的VIP版。 第一个知识点就出来了,V开头的指令就是浮点运算指令,Dx Sx Qx 就是浮点数寄存器。 打开Unidbg浮点数寄存器显示 Unidbg是支持浮点运算模拟的,那么一定是有地方去读取浮点数寄存器的,只是没有显示出来而已。 我们先分析下Unidbg调试时寄存器显示部分的代码。

    31920

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 高性能计算平台

      高性能计算平台

      弹性灵活、性能卓越、自助化的计算资源管理服务,实现弹性使用云上高性能计算资源的需求。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券