精华内容
下载资源
问答
  • 浮点数运算

    2020-02-12 14:03:16
    浮点数运算

    浮点数运算

    在这里插入图片描述

    展开全文
  • 必须阶码一致才可以进行浮点数运算

    在这里插入图片描述
    将他们二进制转换成定点纯小数,为了保证值不变 所以加上阶码,然后化成浮点数的表示形式。
    必须阶码一致才可以进行浮点数运算。
    将阶码小的和阶码大的保持一致,
    因为小变大是移出最低位,大变小是移出最高位,为了误差最小 选择小变大。
    在这里插入图片描述

    在这里插入图片描述
    将位数根据二进制运算算出结果,前面加上阶码,注意不要漏掉移出的那一位。
    在这里插入图片描述
    尾数只是代表浮点数精度,指数才是代表浮点数范围,所以尾数溢出,我们需要调整,也就是规格化。
    数值溢出,将数值部分的1移动到小数点右边,变成00.10100000(0).为了保证数值相同,阶码加1.
    如果不溢出,正数小数点右边开头必须为1,否则左移直到第一位为1.负数必须保证小数点右边第一个是0.
    必须保证是定点纯小数。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • * @function js精确浮点数运算 * @value 运算内容,必须为字符串,例如1+1,加引号'1+1' * @addSub 加法、减法 * @mul 乘法 * @div 除法 */ const arithmetic = { filter(value) { if (!value) return null; ...
    /**
     * @function js精确浮点数运算
     * @value 运算内容,必须为字符串,例如1+1,加引号'1+1'
     * @addSub 加法、减法
     * @mul 乘法
     * @div 除法
     */
    const arithmetic = {
        filter(value) {
            if (!value) return null;
            let valueArr = value.split(/\-|\+|\*|\/|\(|\[|\)|\]|\^/g); //获取所有值集合
            //过滤空值、整数
            return {
                valueArr,
                floatValArr: valueArr.filter(item => {
                    return item != '' && item.indexOf('.') >= 0;
                })
            }
        },
        addSub(value) {
            let {
                floatValArr,
                valueArr
            } = this.filter(value);
            //获取集合中浮点数最长的值
            let maxLen = 0;
            floatValArr.forEach(item => {
                let _arr = item.split('.');
                maxLen = _arr[1].length > maxLen ? _arr[1].length : maxLen;
            });
            if (maxLen == 0) return eval(value); //若没有浮点数,则正常运算
            let maxNum = '1'; //需要整除的数
            for(let i=0;i<maxLen;i++){
                maxNum+='0';
            }
            maxNum = Number(maxNum);
            //小数点前移,至浮点数最长的值长度
            valueArr = valueArr.forEach(item => {
                if (item != '') {
                    value = value.replace(item, item * maxNum);
                }
            });
            return eval(value) / maxNum;
        },
        mul(value) {
            let {floatValArr} = this.filter(value);
            //获取集合中浮点数长度总和
            let maxLen = 0;
            floatValArr.forEach(item => {
                let _arr = item.split('.');
                maxLen += _arr[1].length;
                let multiple = '1';
                for (let i = 0; i < _arr[1].length; i++) {
                    multiple += '0';
                }
                //小数点前移,至浮点数长度
                value = value.replace(item, item * multiple);
            });
            if (maxLen == 0) return eval(value); //若没有浮点数,则正常运算
            let maxNum = '1'; //需要整除的数
            for(let i=0;i<maxLen;i++){
                maxNum+='0';
            }
            maxNum = Number(maxNum);
            return eval(value) / maxNum;
        },
        div(value) {
            let {
                floatValArr,
                valueArr
            } = this.filter(value);
            //获取集合中浮点数最长的值
            let maxLen = 0;
            floatValArr.forEach(item => {
                let _arr = item.split('.');
                maxLen = _arr[1].length > maxLen ? _arr[1].length : maxLen;
            });
            if (maxLen == 0) return eval(value); //若没有浮点数,则正常运算
            let maxNum = '1'; //需要整除的数
            for(let i=0;i<maxLen;i++){
                maxNum+='0';
            }
            maxNum = Number(maxNum);
            //小数点前移,至浮点数最长的值长度
            valueArr = valueArr.forEach(item => {
                if (item != '') {
                    value = value.replace(item, item * maxNum);
                }
            });
            return eval(value);
        }
    }

    实例:

    0.1+0.2    //0.30000000000000004
    1-0.9    //0.09999999999999998
    0.1*0.2    //0.020000000000000004
    arithmetic.addSub('0.1+0.2') // 0.3
    arithmetic.addSub('1-0.9') //0.1
    arithmetic.mul('0.1*0.2') //0.02

     

    展开全文
  • 浮点数运算案例

    千次阅读 2020-03-31 17:35:24
    浮点数运算案例


    前面有写过一篇面试题博文 0.1+0.2 是否等于 0.3。里面也涉及到浮点数运算。本文来详细列举一个浮点数运算案例。

    浮点数运算五个步骤

    1. 对阶
    原则是小阶对大阶。
    如 0.000101 的科学记数法为 1.012^-4 。
    而 0.0101 的科学记数法为 1.01
    2^-2 。
    小阶就是 -4,大阶就是 -2。
    这里需要把 -4 调整成 -2。则 0.000101 的科学记数法为 0.0101 2^-2 。
    阶数相同了,就可以进行尾数运算。
    那么为什么不用大阶对小阶昵。如果把 0.0101 的科学记数法调整为 1.0
    2^-4。这样就是高位移出。损失的精度更高。

    2. 尾数运算
    对阶完之后,就可以将尾数进行运算了。

    3. 规格化
    规格化指的是对于 IEEE754 标准的浮点数来说,尾数必须是1.M的形式。
    规格化操作分为左规和右规两种情况。
    左规指的就是小数点往左移动,比如 0.000101 变成 1.012^-4。
    右规指的就是小数点往右移动,比如10.001 变成 1.001
    2^1。右规一般只移动一位,发生在进位的情况下。比如二进制 11+1 = 100。

    4. 舍入处理
    舍入其实就是四舍五入。溢出的数为 0 则直接舍去,为 1 则加1。
    比如二进制 011110011 只要保留 8 位。因为最后一位尾数是1,则 01111001+1= 01111010。而 二进制 011110010 如果保留 8 位。最后一位尾数是0,直接舍去。结果为 01111001。

    5. 溢出判断
    溢出判断指阶码值是否产生溢出。
    若阶码值超过了阶码所能表示的最大正数,则为上溢。若此时浮点数为正数,则为正上溢,记为+∞,若浮点数为负数,则为负上溢,记为-∞。
    比如用 8 位表示阶码值。则范围为 2^8-1=255。要考虑负数的情况下,范围为 -127-127,此时的阶码值如果是 128。就是上溢。

    若阶码值超过了阶码所能表示的最小负数,则为下溢,若此时浮点数为正数,则为正下溢,若浮点数为负数,则为负下溢。正下溢和负下溢都作为0处理。
    同样如果用 8 位表示阶码值。存在负数的情况下,范围为 -127-127。而此时的阶码值如果是-128。就是下溢。

    案例

    下面我们来计算一下 0.3+1.6 = 1.9000000000000001。

    将 0.3 转换二进制。浮点数转二进制是乘2取整数部分。

    0.3*2=0.6
    0.6*2=1.2
    0.2*2=0.4
    0.4*2=0.8
    0.8*2=1.6
    0.6*2=1.2(从这里开始循环1001)
    

    结果为 0.0100110011001100(1001)…(1001部分无限循环)
    规格化为:1.001100110011… * 2^-2

    将 1.6 转换二进制。浮点数转二进制是乘2取整数部分。

    0.6*2=1.2
    0.2*2=0.4
    0.4*2=0.8
    0.8*2=1.6
    0.6*2=1.2(从这里开始循环1001)
    

    结果为 1.1001100110011001(1)…(0011部分无限循环)
    规格化为:1.100110011001… * 2^0

    1. 对阶
    0.3 的阶数为 -2,1.1 的阶数为0。所以把 0.3 还原为 0.01001100 * 2^0。

    2. 尾数相加
    因为 64 位表示二进制需要四舍五入。
    所以 0.3 的二进制需要进一位。
    0. 0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100(1)
    结果为
    0. 0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101

    同理1.6 的二进制也需要进一位。
    1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001(1)
    结果为
    1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010

    相加:
    0. 0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101
    +1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010
    1.1110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0111

    3. 格式化
    格式化指的就是1*M的形式,这里已经是格式化的数据了。

    4. 舍入处理
    由于 0.3 二进制小数点右移了2位。且第一位为1。所以需要进1。
    结果为
    1.1110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 1110

    5.溢出判断
    由于没有溢出,这里不需要做溢出判断。

    所以最后的结果用 64 位表示为:
    因为是正数,所以首位用 0 表示。
    整数部分为 2^(11-1)-1+(-2)=1021。用二进制表示为 01111111101
    小数部分为 1110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 1110
    所以(0.3)+(1.6)=
    0 01111111101 1110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 0110 1110
    转换为10进制为:1.9000000000000001

    展开全文
  • (方法一:重写浮点运算的函数) //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 //调用:accDiv(arg1,arg2) ...
  • 本文主要讲了关于三菱PLC浮点数运算指令的一些相关知识,希望对你的学习有所帮助。
  • 程序员必知之浮点数运算原理详解

    万次阅读 多人点赞 2016-09-14 14:30:05
    导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握。许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会犯错。这篇文章是这一系列中...
  • 主要介绍了php中让人头疼的浮点数运算,结合实例形式分析了php针对浮点数运算round函数的使用方法,需要的朋友可以参考下
  • 浮点数运算原理详解

    万次阅读 2018-09-03 22:47:45
    导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握。许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会犯错。这篇文章是这一系列中...
  • javascript 浮点数运算

    2015-01-09 16:59:27
    Javascript 和大部分语言一样在浮点数运算时,经常出现精度丢失的问题,由于现在的大量Web项目经常涉及到货币计算或数学高级计算,此插件提供简单浮点运算,浮点存储格式符合IEEE754计算机
  • PHP浮点数运算

    2019-09-26 07:17:11
    PHP浮点数运算 金额计算必需注意此问题! 目录 问题:浮点数的加减乘除 解决方法 1、BCMath 示例 ...
  • 主要介绍了Java中使用BigDecimal进行浮点数运算,需要的朋友可以参考下
  • 浮点数运算误差

    2020-11-26 22:08:52
    文章目录 浮点数运算时 会发生精度损失 由于计算机底部数据存储是二进制形式 8.25 用十进制表示为:8.25 * 10° 120.5 用十进制表示为:1.205 * 102
  • 最近在做一个项目,页面上会存在一些JS浮点数的运算,发现JS浮点数运算存在一些bug.譬如: 0.1+0.2 == 0.30000000000000004 0.1 + 0.7 == 0.7999999999999999 7*0.8 == 5.6000000000000005 5.6/7 == 0....
  • 4-浮点数运算

    2019-09-26 00:50:49
    浮点数运算 浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。 Java的浮点数完全遵循IEEE-754标准,这也是绝大多数计算机平台都支持的浮点数标准表示方法。 浮点数表示的范围大...
  • 解决JS浮点数运算出现Bug的方法,需要的朋友可以参考一下
  • 主要介绍了Python如何执行精确的浮点数运算,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • 本篇文章主要介绍了JS--浮点数运算处理,现在分享给大家,也给大家做个参考。感兴趣的小伙伴们可以参考一下。
  • import java.math.BigDecimal; /** * 由于Java的简单类型不能够精确的对...这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入。 * @author lb */ public final class Arith { // 默认除法运算精度 ...
  • 浮点数运算原理

    2018-05-28 18:24:26
    导读:浮点数运算是一个非常有技术含量的话题,不太容易掌握。许多程序员都不清楚使用==操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会犯错。这篇文章是这一系列中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,472
精华内容 3,788
关键字:

浮点数运算