js 浮点加减乘除

本文介绍了一种在JavaScript中实现高精度浮点数加减乘除的方法,通过自定义函数来避免因浮点数精度问题导致的计算误差,适用于财务等需要精确计算的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 /**
         * js 浮点加减乘除
         * @param a
         * @param b
         */
        function add(a, b) {
            var c, d, e;
            try {
                c = a.toString().split(".")[1].length;
            } catch (f) {
                c = 0;
            }
            try {
                d = b.toString().split(".")[1].length;
            } catch (f) {
                d = 0;
            }
            return e = Math.pow(10, Math.max(c, d)), (mul(a, e) + mul(b, e)) / e;
        }

        function sub(a, b) {
            var c, d, e;
            try {
                c = a.toString().split(".")[1].length;
            } catch (f) {
                c = 0;
            }
            try {
                d = b.toString().split(".")[1].length;
            } catch (f) {
                d = 0;
            }
            return e = Math.pow(10, Math.max(c, d)), (mul(a, e) - mul(b, e)) / e;
        }


        function mul(a, b) {
            var c = 0,
                d = a.toString(),
                e = b.toString();
            try {
                c += d.split(".")[1].length;
            } catch (f) {}
            try {
                c += e.split(".")[1].length;
            } catch (f) {}
            return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
        }



        function div(a, b) {
            var c, d, e = 0,
                f = 0;
            try {
                e = a.toString().split(".")[1].length;
            } catch (g) {}
            try {
                f = b.toString().split(".")[1].length;
            } catch (g) {}
            return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), mul(c / d, Math.pow(10, f - e));
        }

对于给定的概率分布,可以通过Huffman编码算法得到一组最优编码方案,使得平均码字长度最小。 首先需要对概率分布进行从小到大的排序,然后按照以下步骤进行Huffman编码: 1. 将最小的两个概率相加,得到一个新的概率,将这两个概率对应的符号合并为一个节点; 2. 对新的概率分布进行排序; 3. 重复步骤1和2,直到只剩下一个节点为止。 最后,对于每一个叶子节点,从根节点到该节点的路径上的编码为该节点的编码。编码的长度即为该节点的深度。 根据上述算法,可以得到以下的Huffman编码树: ``` 0.01, D / \ 0.02 0.03, G / \ / \ 0.05, C 0.05, F 0.07, H / \ 0.1, A 0.19, B ``` 根据编码树可以得到各个符号的Huffman编码: ``` A: 111 B: 10 C: 010 D: 0000 F: 0010 G: 0001 H: 0011 ``` 根据上述编码方式,可以计算出平均码字长度L: ``` L = 0.5*4 + 0.01*4 + 0.03*4 + 0.05*3 + 0.05*3 + 0.07*4 + 0.19*3 + 0.1*3 = 2.530 ``` 信源熵H可以通过以下公式得到: ``` H = -0.5*log2(0.5) - 0.01*log2(0.01) - 0.03*log2(0.03) - 0.05*log2(0.05) - 0.05*log2(0.05) - 0.07*log2(0.07) - 0.19*log2(0.19) - 0.1*log2(0.1) = 2.175 ``` 编码效率可以通过以下公式计算得到: ``` Efficiency = H / L = 2.175 / 2.530 = 0.858 ``` 压缩比是指原始数据的大小和压缩后数据的大小的比值。这里假设原始数据的大小为1KB,压缩后数据的大小为C KB,则压缩比为: ``` Compression Ratio = 1 / C ``` 冗余度是指信息中与所需传输的信息无关的部分所占信息总量的比例。可以通过以下公式计算得到: ``` Redundancy = (L - H) / L = (2.530 - 2.175) / 2.530 = 0.14 ``` 因此,对于给定的概率分布,Huffman编码的平均码字长度为2.53,信源熵为2.175,编码效率为0.858,压缩比为1/C,冗余度为0.14。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值