精华内容
下载资源
问答
  • 设想以单精度的浮点数为例,阶码有8位,能表示-128~127之间数字;而我们在其阶码进行比较时,如果不偏置,那么0010xx和1000xx在计算机眼中就会认为后者较大,而其实后者是负数;所以这样话,计算机得先把它们...

    日常生活中我们对小数进行加减法时,为了方便,通常先把它们的指数化成一致,再比较前面的数值部分;

    比如1e-3与1e-1,我们化为1e-3和100e-3,这样就能很明显的得到结果 99e-3了,同样,在计算机中亦是如此;

    设想以单精度的浮点数为例,阶码有8位,能表示-128~127之间的数字;而我们在对其阶码进行比较时,如果不偏置,那么0010xx和1000xx在计算机眼中就会认为后者较大,而其实后者是负数;所以这样的话,计算机得先把它们化成原码,再对其进行比较,比较繁琐;

    而当浮点数的阶码采用移码的形式时(偏置127),即E=e-Bias (e∈[1,254],0和255是特殊的值,不呢能取),那么E∈[-126,127],所以浮点数阶码中储存的e全为正数,可直接比较,不用转换成原码再进行;而实际表示的浮点数的指数部分取值范围就是E的取值范围,所以浮点数的精度为-126~12;

    补充一个问题:在观看CSAPP的视频时,里面有个学生提出:为什么这个偏置值要取2k-1-1呢?
    教授的回答是:exp的取值范围为[1,254],而E作为最后小数的指数,它所表示的精度要对半分,非负数要占一般,正数要占一半,而exp只能取254个值,自然最后E的范围只能为[-126,127],只有这样才能刚好对半分,根据Bias=exp-E,从而得到Bias的值为127;

    展开全文
  • 并不是java的浮点数精度会丢失,而是所有二进制存储中的浮点数都可能会精度丢失(部分特殊的小数数值可以精确表示),所以计算机...如果再这个二进制进行计算,明显计算结果的精度会进一步丢失。 得到一个无限...

    并不是java的浮点数精度会丢失,而是所有用二进制存储中的浮点数都可能会精度丢失(部分特殊的小数数值可以精确表示),所以计算机中存储的浮点数都存在精度丢失的风险,不过一边这个丢失的精度对我们正常的使用不会构成影响。

    小数在转换为二进制时并不一定能用一个精确的二进制表示,大多数时候都是取的一个近似值,这就造成了精度的丢失。如果再用这个二进制进行计算,明显计算结果的精度会进一步丢失。

    得到一个无限循环的二进制小数 0.000110011…,没办法用一个精确的二进制表示0.1。而且计算机中存储一个浮点数所用的位数也是有限的,所以只能选择在某一个精度进行保存。

    举个简单的例子把0.1用二进制表示:

    (1) 0.1 x 2 = 0.2  取整数位 0 得 0.0

    (2) 0.2 x 2 = 0.4  取整数位 0 得 0.00

    (3) 0.4 x 2 = 0.8  取整数位 0 得 0.000

    (4) 0.8 x 2 = 1.6  取整数位 1 得 0.0001

    (5) 0.6 x 2 = 0.2  取整数位 1 得 0.00011

    (6) 0.2 x 2 = 0.4  取整数位 0 得 0.000110

    (7) 0.4 x 2 = 0.8  取整数位 0 得 0.0001100

    (8) 0.8 x 2 = 1.6  取整数位 1 得 0.00011001

    (9) 0.6 x 2 = 1.2  取整数位 1 得 0.000110011

    (n) ...

    当然也有特殊的小数,比如0.25的二进制为0.01。

    展开全文
  • 产生这样原因是计算机内部部分浮点数不能准确地二进制表示,就像我们不能十进制准确表示10/3一样. 所以对于浮点数来计算金额这些敏感数据,推荐使用PHPBC函数 BCMath 任意精度数学bcadd— 2个任意...

    echo intval(0.58*100);//结果为57

    echo intval((0.1 + 0.7) * 10);//结果为7

    产生这样的原因是计算机内部对部分浮点数不能准确地用二进制表示,就像我们不能用十进制准确表示10/3一样.

     

    所以对于浮点数来计算金额这些敏感的数据,推荐使用PHP的BC函数

     

    BCMath 任意精度数学
    bcadd — 2个任意精度数字的加法计算
    bccomp — 比较两个任意精度的数字
    bcdiv — 2个任意精度的数字除法计算
    bcmod — 对一个任意精度数字取模
    bcmul — 2个任意精度数字乘法计算
    bcpow — 任意精度数字的乘方
    bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
    bcscale — 设置所有bc数学函数的默认小数点保留位数
    bcsqrt — 任意精度数字的二次方根
    bcsub — 2个任意精度数字的减法
    ---------------------
    作者:清风169
    来源:CSDN
    原文:https://blog.csdn.net/weixin_37909391/article/details/80911087
    版权声明:本文为博主原创文章,转载请附上博文链接!

    转载于:https://www.cnblogs.com/stillstep/p/11063142.html

    展开全文
  • 我们平常使用float或者double进行计算时会出现精度丢失情况,例如: system.out.println(0.06-0.01) 得到的结果为0.049999999999999996 为什么会出现这种情况呢? 原因在于我们计算机是二进制。...

    我们平常使用float或者double进行计算时会出现精度丢失的情况,例如:

    system.out.println(0.06-0.01)

    得到的结果为0.049999999999999996

     

    为什么会出现这种情况呢?

     

    原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:0.5的二进制表示并非就是精确的0.5。反而最为接近的二进制表示是 0.049999999999999996。

     

    在这种情况下我们就需要用到java.math包下面的BigDecimal类,BigDecimal主要用于高精度的数据计算,例如计算金额的时候,还有工程测量计算的时候。BigDecimal的提供了add(),subtract(),multiply()和divide()四种方法,分别为加减乘除,一般计算包含小数的用法为

    BigDecimal b1 = new BigDecimal(a1);
    BigDecimal b2 = new BigDecimal(a2);
    System.out.println(b1.subtract(b2).doubleValue());

    其中a1和a2的类型可以为String,Double,int,long等等,我在实际用的时候发现了一个问题,当a1和a2的类型为Double的时候,得到的结果仍然丢失了精度,例如:

    BigDecimal b1 = new BigDecimal(0.06);
    BigDecimal b2 = new BigDecimal(0.01);
    System.out.println(b1.subtract(b2).doubleValue());

    得到的结果仍然为0.049999999999999996
    可是如果参数类型为String,结果就是正确的,就像这样:

    BigDecimal b1 = new BigDecimal("0.06");
    BigDecimal b2 = new BigDecimal("0.01");
    System.out.println(b1.subtract(b2).doubleValue());

    得到的结果为0.05。

    经过测试发现,原来在new BigDecimal(0.06)的时候,得到b1的结果为0.059999999999999997779553950749686919152736663818359375,而b2的值为0.01000000000000000020816681711721685132943093776702880859375,这时候就已经精度丢失了,最后得到的结果很显然也会丢失精度,而使用new BigDecimal("0.06")得到的b1仍然为0.06。

    所以如果大家要对小数进行精确计算的话,new BigDecimal()的参数一定要用String类型的。

    下面是已经封装好了的工具类:

    public class BigDecimalUtils {
            /**
             * 提供精确的加法运算
             *
             * @param v1 被加数
             * @param v2 加数
             * @param scale 保留scale 位小数
             * @return 两个参数的和
             */
            public static String add(String v1, String v2, int scale) {
                if (scale < 0) {
                    throw new IllegalArgumentException("保留的小数位数不能小于零");
                }
                BigDecimal b1 = new BigDecimal(v1);
                BigDecimal b2 = new BigDecimal(v2);
                return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
            }
    
            /**
             * 提供精确的减法运算
             *
             * @param v1 被减数
             * @param v2 减数
             * @param scale 保留scale 位小数
             * @return 两个参数的差
             */
            public static String sub(String v1, String v2, int scale) {
                if (scale < 0) {
                    throw new IllegalArgumentException("保留的小数位数不能小于零");
                }
                BigDecimal b1 = new BigDecimal(v1);
                BigDecimal b2 = new BigDecimal(v2);
                return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
            }
    
            /**
             * 提供精确的乘法运算
             *
             * @param v1 被乘数
             * @param v2 乘数
             * @param scale 保留scale 位小数
             * @return 两个参数的积
             */
            public static String mul(String v1, String v2, int scale) {
                if (scale < 0) {
                    throw new IllegalArgumentException("保留的小数位数不能小于零");
                }
                BigDecimal b1 = new BigDecimal(v1);
                BigDecimal b2 = new BigDecimal(v2);
                return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
            }
    
            /**
             * 提供精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入
             *
             * @param v1 被除数
             * @param v2 除数
             * @param scale 表示需要精确到小数点以后几位
             * @return 两个参数的商
             */
            public static String div(String v1, String v2, int scale) {
                if (scale < 0) {
                    throw new IllegalArgumentException("保留的小数位数不能小于零");
                }
                BigDecimal b1 = new BigDecimal(v1);
                BigDecimal b2 = new BigDecimal(v2);
                return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
            }
    
            /**
             * 提供精确的小数位四舍五入处理
             *
             * @param v 需要四舍五入的数字
             * @param scale 小数点后保留几位
             * @return 四舍五入后的结果
             */
            public static String round(String v, int scale) {
                if (scale < 0) {
                    throw new IllegalArgumentException("保留的小数位数不能小于零");
                }
                BigDecimal b = new BigDecimal(v);
                return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
            }
    
            /**
             * 取余数
             *
             * @param v1 被除数
             * @param v2 除数
             * @param scale 小数点后保留几位
             * @return 余数
             */
            public static String remainder(String v1, String v2, int scale) {
                if (scale < 0) {
                    throw new IllegalArgumentException("保留的小数位数不能小于零");
                }
                BigDecimal b1 = new BigDecimal(v1);
                BigDecimal b2 = new BigDecimal(v2);
                return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
            }
    
            /**
             * 比较大小
             *
             * @param v1 被比较数
             * @param v2 比较数
             * @return 如果v1 大于v2 则 返回true 否则false
             */
            public static boolean compare(String v1, String v2) {
                BigDecimal b1 = new BigDecimal(v1);
                BigDecimal b2 = new BigDecimal(v2);
                int bj = b1.compareTo(b2);
                if (bj > 0)
                    return true;
                else
                    return false;
            }
    }


    如果有地方说的不对,欢迎指正!!!

    展开全文
  • 两个容量不一样数据类型变量进行算术运算时,java会自动将小容量变量进行精度提升,然后再进行运算,得到的结果类型是提升后大容量数据类型.如果将该结果赋值给小容量数据类型变量,则必须进行强制...
  • 那是因为计算机内部部分浮点数不能准确地二进制表示,就像我们不能十进制准确表示1/3=0.33333333333333一样。所以,永远不要相信浮点数精确到了最后一位,如果涉及到需要浮点数来进行...
  • short i =1; i=i+1与short i=1; i+=1区别

    千次阅读 2017-05-31 21:45:20
    两个容量不一样数据类型变量进行算术运算时,java会自动将小容量变量进行精度提升,然后再进行运算,得到的结果类型是提升后大容量数据类型.如果将该结果赋值给小容量数据类型变量,则必须进行强制...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    5.17 说真,真有机器非零空指针吗,或者不同类型不同的表示? 地址0上到底有什么? 5.18 运行时整数值0转换为指针以后一定是空指针吗? 5.19 如何访问位于机器地址0处中断向量?如果我将指针值设为0...
  • 在matlab中具体用什么算法实现这些,我们先不管,我们需要注意是怎么使用。比如使用BP神经网络newff()构建一个网络,这些在后面学习将提到。 BP网络特点 ①网络实质上实现了一个从输入到输出映射...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    内容简介 《你必须知道495个C语言问题》以问答...5.17 说真,真有机器非零空指针吗,或者不同类型不同的表示? 61 地址0 上到底有什么? 61 5.18 运行时整数值0转换为指针以后一定是空指针吗? 61 5.19...
  • 5.17 说真,真有机器非零空指针吗,或者不同类型不同的表示? 61 地址0 上到底有什么? 61 5.18 运行时整数值0转换为指针以后一定是空指针吗? 61 5.19 如何访问位于机器地址0处中断向量?如果我将...
  • 浮点数判等

    2017-04-17 10:22:42
    浮点数判等 (本文仅为笔者的个人学习笔记,如有不当之处... 在一些计算中因为不需要很高的精度所以一般进行舍入对结果没有什么影响。而在浮点数的判断中这中不能二进制表示的小数就不能参与判断,例如计算机计
  • 电子计算机是一种能够存储程序、并且通过执行程序,进行自动、高速、准确地进行各种复杂的运算,输出匀速结果的高科技电子设备。计算机为什么二进制表示信息?1.便于信息的表示和存储2.抗干扰能力强、可靠性高3....
  • 结果的显示格式采用科学计数法,即有效数字乘以10 为底的幂。这里设计的频 率计4 位数码管显示测量结果。 定时方法实现频率测量。定时方法测量的是待测信号的周期,这种方法只设 一种量程,测量结果通过浮点数运算...
  • 大数运算

    2012-10-27 21:18:00
    大数是指计算的数值非常大或者运算的精度要求非常高,已知的数据类型无法精确表示的值。 计算大数的方法一般是数组模拟大数的运算。 之前写过,基本思想就是从低位到高位的按照加减乘除的运算规则来做,就是...
  • C语言科学和艺术.pdf

    热门讨论 2012-01-19 14:09:05
    13.3.2 引用调用返回多个结果 362 13.3.3 过度使用引用调用危险 364 13.4 指针和数组 364 13.4.1 指针运算 365 13.4.2 运算符++和--新作用 367 13.4.3 指针自增和自减 369 13.4.4 指针和数组...
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    不同编译器给出不同的结果, 有为 3, 有为4, 哪个是正确? . . . . . . . . . . . . . . . . . . . . . 14 3.4 这是个巧妙表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换a 和b 值。. . . . . ....
  • 所谓符号计算是指在运算时,无须事先变量赋值,而将所得到结果以标准符号形式来表示。 例如,在符号变量运算过程中pi就pi表示,而不是具体近似数值在这里插入代码片3.14或3.1415926。使用符号变量进行运算能...
  • java之运算符

    2013-09-22 20:30:27
    虽然我们大二时候开过java这门课程,可至今我还不知道他究竟是干什么用的。可以说我是个不折不扣初学者,今天看了马士兵视频觉得他讲很不错。下面我就我看运算符这一节谈谈我个人体会。 1.当有若干变量...

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
关键字:

对结果的精度用什么表示