自己做的一个c#超大浮点数bigFloat

IEEE 754浮点数与十六进制转换:原理、编程实现与嵌入式/通信实战 在计算机科学和嵌入式开发中,数据在内存中的表示是连接高级语言与底层硬件的桥梁。IEEE 754标准定义了浮点数在内存中的存储格式,其核心原理是将一个浮点数分解为符号位、指数位和尾数位三部分,并通过偏移量编码实现高效的范围表示和比较。理解这一原理对于处理原始数据流、进行协议分析和系统调试具有关键的技术价值。在实际应用场景中,无论是解析嵌入式设备的Hex/S19文件,还是处理Modbus等通信协议中的浮点数据,都会涉及到浮点数与其十六进制原始形态之间的转换。本文以Python、C++等语言为例,深入探讨了通过指 阅读详情

当下有很多超大数值的游戏,就目标的Int或者Int64根本无法够用。所以做了下面的bigFloat,理论支持9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999…(2^31)位数,够用了吧。因为有字符串和循环运算,所以后面要做一个效率的测试。

因为是初版代码没严格测试,可能有很多问题。请慎用。

因为是字符串操作,不建议用来大量计算的使用。但是用作一般频率运算还是可以的。啥是一般频率……呵呵

using System;
/*
 *  当下有很多超大数值的游戏,就目标的Int或者Int64根本无法够用。所以做了下面的bigFloat,理论支持9999999999999999999....(2^31)位数,够用了吧。因为有字符串和循环运算,所以后面要做一个效率的测试。
 *  how to use:
    bigInt a0 = (bigFloat)"-0.012345678e1";
    bigInt a1 = new bigFloat(1234, -3);
    a0 + a1
    a0 - a1
    a0 * a1
    a0 / a1
	转载或者使用请勿删除出处
	https://blog.youkuaiyun.com/thinbug/article/details/100973270
*/
public struct bigFloat 
{
    //每个单位的进位
    //ToString函数的显示格式,目前是26*26+5位数支持,可以自行添加扩充
    private static string[] bigUnit = new string[]{ "" , "k" , "m" , "b" , "t",
                            "aa" ,  "ab" ,  "ac" ,  "ad" ,  "ae" ,  "af" ,  "ag" ,  "ah" ,  "ai" ,  "aj" ,  "ak" ,  "al" ,  "am" ,  "an" ,  "ao" ,  "ap" ,  "aq" ,  "ar" ,  "as" ,  "at" ,  "au" ,  "av" ,  "aw" ,  "ax" ,  "ay" ,  "az" ,
                            "ba" ,  "bb" ,  "bc" ,  "bd" ,  "be" ,  "bf" ,  "bg" ,  "bh" ,  "bi" ,  "bj" ,  "bk" ,  "bl" ,  "bm" ,  "bn" ,  "bo" ,  "bp" ,  "bq" ,  "br" ,  "bs" ,  "bt" ,  "bu" ,  "bv" ,  "bw" ,  "bx" ,  "by" ,  "bz" ,
                            "ca" ,  "cb" ,  "cc" ,  "cd" ,  "ce" ,  "cf" ,  "cg" ,  "ch" ,  "ci" ,  "cj" ,  "ck" ,  "cl" ,  "cm" ,  "cn" ,  "co" ,  "cp" ,  "cq" ,  "cr" ,  "cs" ,  "ct" ,  "cu" ,  "cv" ,  "cw" ,  "cx" ,  "cy" ,  "cz" ,
                            "da" ,  "db" ,  "dc" ,  "dd" ,  "de" ,  "df" ,  "dg" ,  "dh" ,  "di" ,  "dj" ,  "dk" ,  "dl" ,  "dm" ,  "dn" ,  "do" ,  "dp" ,  "dq" ,  "dr" ,  "ds" ,  "dt" ,  "du" ,  "dv" ,  "dw" ,  "dx" ,  "dy" ,  "dz" ,
                            "ea" ,  "eb" ,  "ec" ,  "ed" ,  "ee" ,  "ef" ,  "eg" ,  "eh" ,  "ei" ,  "ej" ,  "ek" ,  "el" ,  "em" ,  "en" ,  "eo" ,  "ep" ,  "eq" ,  "er" ,  "es" ,  "et" ,  "eu" ,  "ev" ,  "ew" ,  "ex" ,  "ey" ,  "ez" ,
                            "fa" ,  "fb" ,  "fc" ,  "fd" ,  "fe" ,  "ff" ,  "fg" ,  "fh" ,  "fi" ,  "fj" ,  "fk" ,  "fl" ,  "fm" ,  "fn" ,  "fo" ,  "fp" ,  "fq" ,  "fr" ,  "fs" ,  "ft" ,  "fu" ,  "fv" ,  "fw" ,  "fx" ,  "fy" ,  "fz" ,
                            "ga" ,  "gb" ,  "gc" ,  "gd" ,  "ge" ,  "gf" ,  "gg" ,  "gh" ,  "gi" ,  "gj" ,  "gk" ,  "gl" ,  "gm" ,  "gn" ,  "go" ,  "gp" ,  "gq" ,  "gr" ,  "gs" ,  "gt" ,  "gu" ,  "gv" ,  "gw" ,  "gx" ,  "gy" ,  "gz" ,
                            "ha" ,  "hb" ,  "hc" ,  "hd" ,  "he" ,  "hf" ,  "hg" ,  "hh" ,  "hi" ,  "hj" ,  "hk" ,  "hl" ,  "hm" ,  "hn" ,  "ho" ,  "hp" ,  "hq" ,  "hr" ,  "hs" ,  "ht" ,  "hu" ,  "hv" ,  "hw" ,  "hx" ,  "hy" ,  "hz" ,
                            "ia" ,  "ib" ,  "ic" ,  "id" ,  "ie" ,  "if" ,  "ig" ,  "ih" ,  "ii" ,  "ij" ,  "ik" ,  "il" ,  "im" ,  "in" ,  "io" ,  "ip" ,  "iq" ,  "ir" ,  "is" ,  "it" ,  "iu" ,  "iv" ,  "iw" ,  "ix" ,  "iy" ,  "iz" ,
                            "ja" ,  "jb" ,  "jc" ,  "jd" ,  "je" ,  "jf" ,  "jg" ,  "jh" ,  "ji" ,  "jj" ,  "jk" ,  "jl" ,  "jm" ,  "jn" ,  "jo" ,  "jp" ,  "jq" ,  "jr" ,  "js" ,  "jt" ,  "ju" ,  "jv" ,  "jw" ,  "jx" ,  "jy" ,  "jz" ,
                            "ka" ,  "kb" ,  "kc" ,  "kd" ,  "ke" ,  "kf" ,  "kg" ,  "kh" ,  "ki" ,  "kj" ,  "kk" ,  "kl" ,  "km" ,  "kn" ,  "ko" ,  "kp" ,  "kq" ,  "kr" ,  "ks" ,  "kt" ,  "ku" ,  "kv" ,  "kw" ,  "kx" ,  "ky" ,  "kz" ,
                            "la" ,  "lb" ,  "lc" ,  "ld" ,  "le" ,  "lf" ,  "lg" ,  "lh" ,  "li" ,  "lj" ,  "lk" ,  "ll" ,  "lm" ,  "ln" ,  "lo" ,  "lp" ,  "lq" ,  "lr" ,  "ls" ,  "lt" ,  "lu" ,  "lv" ,  "lw" ,  "lx" ,  "ly" ,  "lz" ,
                            "ma" ,  "mb" ,  "mc" ,  "md" ,  "me" ,  "mf" ,  "mg" ,  "mh" ,  "mi" ,  "mj" ,  "mk" ,  "ml" ,  "mm" ,  "mn" ,  "mo" ,  "mp" ,  "mq" ,  "mr" ,  "ms" ,  "mt" ,  "mu" ,  "mv" ,  "mw" ,  "mx" ,  "my" ,  "mz" ,
                            "na" ,  "nb" ,  "nc" ,  "nd" ,  "ne" ,  "nf" ,  "ng" ,  "nh" ,  "ni" ,  "nj" ,  "nk" ,  "nl" ,  "nm" ,  "nn" ,  "no" ,  "np" ,  "nq" ,  "nr" ,  "ns" ,  "nt" ,  "nu" ,  "nv" ,  "nw" ,  "nx" ,  "ny" ,  "nz" ,
                            "oa" ,  "ob" ,  "oc" ,  "od" ,  "oe" ,  "of" ,  "og" ,  "oh" ,  "oi" ,  "oj" ,  "ok" ,  "ol" ,  "om" ,  "on" ,  "oo" ,  "op" ,  "oq" ,  "or" ,  "os" ,  "ot" ,  "ou" ,  "ov" ,  "ow" ,  "ox" ,  "oy" ,  "oz" ,
                            "pa" ,  "pb" ,  "pc" ,  "pd" ,  "pe" ,  "pf" ,  "pg" ,  "ph" ,  "pi" ,  "pj" ,  "pk" ,  "pl" ,  "pm" ,  "pn" ,  "po" ,  "pp" ,  "pq" ,  "pr" ,  "ps" ,  "pt" ,  "pu" ,  "pv" ,  "pw" ,  "px" ,  "py" ,  "pz" ,
                            "qa" ,  "qb" ,  "qc" ,  "qd" ,  "qe" ,  "qf" ,  "qg" ,  "qh" ,  "qi" ,  "qj" ,  "qk" ,  "ql" ,  "qm" ,  "qn" ,  "qo" ,  "qp" ,  "qq" ,  "qr" ,  "qs" ,  "qt" ,  "qu" ,  "qv" ,  "qw" ,  "qx" ,  "qy" ,  "qz" ,
                            "ra" ,  "rb" ,  "rc" ,  "rd" ,  "re" ,  "rf" ,  "rg" ,  "rh" ,  "ri" ,  "rj" ,  "rk" ,  "rl" ,  "rm" ,  "rn" ,  "ro" ,  "rp" ,  "rq" ,  "rr" ,  "rs" ,  "rt" ,  "ru" ,  "rv" ,  "rw" ,  "rx" ,  "ry" ,  "rz" ,
                            "sa" ,  "sb" ,  "sc" ,  "sd" ,  "se" ,  "sf" ,  "sg" ,  "sh" ,  "si" ,  "sj" ,  "sk" ,  "sl" ,  "sm" ,  "sn" ,  "so" ,  "sp" ,  "sq" ,  "sr" ,  "ss" ,  "st" ,  "su" ,  "sv" ,  "sw" ,  "sx" ,  "sy" ,  "sz" ,
                            "ta" ,  "tb" ,  "tc" ,  "td" ,  "te" ,  "tf" ,  "tg" ,  "th" ,  "ti" ,  "tj" ,  "tk" ,  "tl" ,  "tm" ,  "tn" ,  "to" ,  "tp" ,  "tq" ,  "tr" ,  "ts" ,  "tt" ,  "tu" ,  "tv" ,  "tw" ,  "tx" ,  "ty" ,  "tz" ,
                            "ua" ,  "ub" ,  "uc" ,  "ud" ,  "ue" ,  "uf" ,  "ug" ,  "uh" ,  "ui" ,  "uj" ,  "uk" ,  "ul" ,  "um" ,  "un" ,  "uo" ,  "up" ,  "uq" ,  "ur" ,  "us" ,  "ut" ,  "uu" ,  "uv" ,  "uw" ,  "ux" ,  "uy" ,  "uz" ,
                            "va" ,  "vb" ,  "vc" ,  "vd" ,  "ve" ,  "vf" ,  "vg" ,  "vh" ,  "vi" ,  "vj" ,  "vk" ,  "vl" ,  "vm" ,  "vn" ,  "vo" ,  "vp" ,  "vq" ,  "vr" ,  "vs" ,  "vt" ,  "vu" ,  "vv" ,  "vw" ,  "vx" ,  "vy" ,  "vz" ,
                            "wa" ,  "wb" ,  "wc" ,  "wd" ,  "we" ,  "wf" ,  "wg" ,  "wh" ,  "wi" ,  "wj" ,  "wk" ,  "wl" ,  "wm" ,  "wn" ,  "wo" ,  "wp" ,  "wq" ,  "wr" ,  "ws" ,  "wt" ,  "wu" ,  "wv" ,  "ww" ,  "wx" ,  "wy" ,  "wz" ,
                            "xa" ,  "xb" ,  "xc" ,  "xd" ,  "xe" ,  "xf" ,  "xg" ,  "xh" ,  "xi" ,  "xj" ,  "xk" ,  "xl" ,  "xm" ,  "xn" ,  "xo" ,  "xp" ,  "xq" ,  "xr" ,  "xs" ,  "xt" ,  "xu" ,  "xv" ,  "xw" ,  "xx" ,  "xy" ,  "xz" ,
                            "ya" ,  "yb" ,  "yc" ,  "yd" ,  "ye" ,  "yf" ,  "yg" ,  "yh" ,  "yi" ,  "yj" ,  "yk" ,  "yl" ,  "ym" ,  "yn" ,  "yo" ,  "yp" ,  "yq" ,  "yr" ,  "ys" ,  "yt" ,  "yu" ,  "yv" ,  "yw" ,  "yx" ,  "yy" ,  "yz" ,
                            "za" ,  "zb" ,  "zc" ,  "zd" ,  "ze" ,  "zf" ,  "zg" ,  "zh" ,  "zi" ,  "zj" ,  "zk" ,  "zl" ,  "zm" ,  "zn" ,  "zo" ,  "zp" ,  "zq" ,  "zr" ,  "zs" ,  "zt" ,  "zu" ,  "zv" ,  "zw" ,  "zx" ,  "zy" ,  "zz"
    };
    private static int unitMath = 3;  //科学计数法来分割3个逗号一个进位
    private static int intExtendPower = 6;  //后三位int代表小数点,也就是精度,一般6位小数够用了
    private static int intExtendMultiply = 1000000;  //后6位int代表小数点
    private static int intExtendMultiply10 = 10000000;  //10就是10,000,000

    private Int64 _b ;    //小数部分
    private int _e ;    //指数部分

    //direct表示是否要乘以intExtendMultiply,通常外部创建需要direct为false,会乘以小数精度,内部计算直接就使用
    public bigFloat(Int64 __b, int __e, bool direct = false)
    {
        _b = __b * (direct ? 1 : intExtendMultiply);
        _e = __e;
        if (_b == 0)
            _e = 0;
        this = bitIntFormat(this);
    }

    //格式化一个小数,格式必须是1.2345e9 这样的标准格式.
    public bigFloat(string str)
    {
        string __x;
        int index = str.ToLower().IndexOf("e");
        int dot = str.IndexOf(".");
        int i, mult;
        int addDot = 0;
        
        if (dot != -1)
        {
            //如果是小数,首先检查第一个数字是否是0开头,那么就有问题,例如:0.01234e4,要格式化成1.234e2
            if (str[dot - 1] == '0' && (dot == 1 || (dot == 2 && str[0] == '-'))) 
            {
                for (i = dot + 1; i < str.Length; i++)
                {
                    if (str[i] != '0')
                        break;
                }
                addDot = i - dot;
                //UnityEngine.Debug.Log(str);
                //UnityEngine.Debug.Log("str.Substring(dot + addDot, 1):"+ str.Substring(dot + addDot, 1));
                //UnityEngine.Debug.Log("str.Subs):" + str.Substring(dot + addDot + 1, str.Length - (dot + addDot + 1)));

                str = str.Substring(0, dot) + str.Substring(dot + addDot, 1) + "." + str.Substring(dot + addDot + 1, str.Length - (dot + addDot + 1));
                //UnityEngine.Debug.Log(str);

                index = str.ToLower().IndexOf("e");
                dot = str.IndexOf(".");
            }
        }

        if (index == -1)    //没有e
        {
            if (dot == -1)   //没小数点
            {
                _b = Int64.Parse(str) * intExtendMultiply;
            }
            else
            {
                //整数部分
                _b = Int64.Parse(str.Substring(0, dot)) * intExtendMultiply;
                //小数部分
                __x = str.Substring(dot + 1);
                mult = intExtendMultiply / 10;
                for (i = 0; i < __x.Length; i++)
                {
                    if(_b >= 0)
                        _b += Int64.Parse(__x[i].ToString()) * mult;
                    else
                        _b -= Int64.Parse(__x[i].ToString()) * mult;
                    mult = mult / 10;
                }
            }
            _e = 0;
        }
        else
        {
            if (dot == -1)   //没小数点
            {
                _b = Int64.Parse(str.Substring(0, index));
            }
            else
            {
                //整数部分
                _b = Int64.Parse(str.Substring(0, dot)) * intExtendMultiply;
                //小数部分
                __x = str.Substring(dot + 1, index - (dot + 1));
                mult = intExtendMultiply / 10;
                for (i = 0; i < __x.Length; i++)
                {
                    if (_b >= 0)
                        _b += Int64.Parse(__x[i].ToString()) * mult;
                    else
                        _b -= Int64.Parse(__x[i].ToString()) * mult;
                    mult = mult / 10;
                }
                
            }
            _e = int.Parse(str.Substring(index + 1)) - addDot;
        }

        if (_b == 0)
            _e = 0;

        this = bitIntFormat(this);
    }

    #region Equals(==)
    public bool Equals(bigFloat obj)
    {
        //this非空,obj如果为空,则返回false
        if (ReferenceEquals(null, obj)) return false;

        //如果为同一对象,必然相等
        if (ReferenceEquals(this, obj)) return true;

        //如果类型不同,则必然不相等
        if (obj.GetType() != this.GetType()) return false;

        return obj._b == _b && obj._e == _e;
    }
    public override bool Equals(object obj)
    {
        return Equals((bigFloat)obj);
    }

    //重写==操作符
    public static bool operator ==(bigFloat left, bigFloat right)
    {
        return Equals(left, right);
    }

    //重写!=操作符
    public static bool operator !=(bigFloat left, bigFloat right)
    {
        return !Equals(left, right);
    }

    public override int GetHashCode()
    {
        return _b.GetHashCode() & _e.GetHashCode();
    }
    #endregion


    //隐式转换 : string x = new bigFloat(1,2);
    public static implicit operator string(bigFloat rmb)
    {
        if(rmb._b >= 0)
            return string.Format("{0}.{1}e{2}", rmb._b / intExtendMultiply, rmb._b % intExtendMultiply, rmb._e);
        else
            return string.Format("{0}.{1}e{2}", rmb._b / intExtendMultiply, -rmb._b % intExtendMultiply, rmb._e);
    }

    //显式转换 : bigInt b = (bigInt)"8e1";
    public static explicit operator bigFloat(string str)
    {
        return new bigFloat(str);
    }

    //标准格式化
    //把类似12345.88转换成1.234588e4这样的标准格式
    public static bigFloat bitIntFormat(bigFloat b)
    {
        //10 -> 1 之间的不用判断了
        if (b._b < intExtendMultiply10 && b._b >= intExtendMultiply)            return b;
        //-10 -> -1之间的不用判断了
        if (b._b > -intExtendMultiply10 && b._b <= -intExtendMultiply)            return b;
        
        //小于1的,需要改为大于1

        string e_str = b._b.ToString("E");
        int ifind = e_str.IndexOf("E");
        if (ifind == -1)
        {
            //Debug.LogError("error float(e)" + e_str);
            return b;
        }

        //# 跳过正负符号
        
        //int b = float.Parse(e_str.Substring(0,ifind));  //减去3是因为1000代表1
        ifind += 1;
        int e = int.Parse(e_str.Substring(ifind)) - intExtendPower;  //减去3是因为1000代表1
        b._b = (Int64)(b._b * Math.Pow(10, -e));
        b._e = b._e + e;

        return b;
    }

    //格式化显示 "323.5k" , "12.34zz"
    public override string ToString()
    {
        int xe = _e % unitMath;    //每个单位是3个0
        int eabc = _e / unitMath;
        string outStr;
        Int64 newb = (Int64)(_b * Math.Pow(10, xe));

        if (eabc < 0)
            eabc = 0;

        //判断是否有没小数点
        Int64 yu = newb % intExtendMultiply;
        int len;
        if (yu == 0)
        {
            if (newb >= 0)
                len = 6;
            else
                len = 7;    //负数
            outStr = (newb / intExtendMultiply).ToString();
            //只获取3位有效数字 
            outStr = string.Format("{0}{1}", outStr.Substring(0, outStr.Length < len ? outStr.Length : len), bigUnit[eabc]);
        }
        else
        {
            if (newb >= 0)
                len = 8;    //多小数点
            else
                len = 9;    //负数
            if (newb >= 0)
                outStr = string.Format("{0}.{1}", newb / intExtendMultiply, newb % intExtendMultiply);
            else
                outStr = string.Format("{0}.{1}", newb / intExtendMultiply, -newb % intExtendMultiply);
            //只获取4位有效数字 
            outStr = string.Format("{0}{1}", outStr.Substring(0, outStr.Length < len ? outStr.Length : len), bigUnit[eabc]);
        }
        return outStr;
    }

    public static bigFloat operator +(bigFloat a, bigFloat b)
    {
        int sube = b._e - a._e;
        //超过精度大小了就要返回大的 , 加1是因为还有个整数+小数4位
        if (sube > intExtendPower +1)  
            return new bigFloat(b._b, b._e,true);
        else if (sube < -intExtendPower -1)
            return new bigFloat(a._b, a._e, true);

        int i;
        if (sube == 0)
        {
            //如果两个数的指数相同
            return new bigFloat(a._b + b._b, a._e , true);
        }
        else if (sube >= 0)
        {
            //如果加的数比较大,把小的数缩小
            Int64 num = a._b;
            for (i = 0; i < sube; i++)
            {
                num = num / 10; //一次移动一次小数点
            }
            return new bigFloat(b._b + num, b._e, true);
        }
        else
        {
            //如果加的数比较小,把小的数缩小
            Int64 num = b._b;
            for (i = sube; i < 0; i++)
            {
                num = num / 10; //一次移动一次小数点
            }
            return new bigFloat(a._b + num, a._e, true);
        }
    }
    public static bigFloat operator -(bigFloat a, bigFloat b)
    {
        b._b = -b._b;
        return a + b;
    }

    public static bigFloat operator *(bigFloat a, bigFloat b) {
        a._b = a._b * b._b;
        a._e = a._e + b._e;
        return bitIntFormat(a);
    }

    public static bigFloat operator /(bigFloat a, bigFloat b) {
        a._b = a._b / b._b;
        a._e = a._e - b._e;
        return bitIntFormat(a);
    }

    public static bool operator <(bigFloat a, bigFloat b) {
        if (a._e == b._e)
        {
            if (a._b < b._e)
                return true;
            else
                return false;
        }
        else if (a._e < b._e)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public static bool operator <=(bigFloat a, bigFloat b)
    {
        if (a._e == b._e)
        {
            if (a._b <= b._e)
                return true;
            else
                return false;
        }
        else if (a._e < b._e)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public static bool operator >(bigFloat a, bigFloat b) {
        if (a <= b)
            return false;
        return true;
    }
    public static bool operator >=(bigFloat a, bigFloat b) {
        if (a < b)
            return false;
        return true;
    }  


}


如果用C#来做,其实可以用System.Numerics的BigInteger来做,可能效率更好一些。
后面有时间用这个来做一个精度和运算效率更好的。

BigInteger参考

https://docs.microsoft.com/en-us/dotnet/api/system.numerics.biginteger?view=netframework-4.8

C#中BigInteger类的深入剖析与实践 在C#编程语言中,BigInteger类是用于处理任意大小整数的一种数据类型,它不受标准整数类型的大小限制。BigInteger能够表示的数值范围远远超过了内置的整数类型,如int或long。在.NET框架中,BigInteger类提供了一种表示不超出指定范围的任意精度整数的方法。它主要用于处理那些超出标准整数类型(如intlong)表示范围的大整数。BigInteger类在内部使用int[]类型的数组来存储大整数的每一位,这样的设计允许BigInteger。 阅读详情

相关推荐

BigNumerics:BigInteger,BigDecimal和BigFloat。-开源

单个封装中具有任意精度的所有数量的所有格式,包括所有三角函数,对数函数,算术函数,矩阵函数等。

定点数与浮点数:计算机数字表示的核心原理与工程实践

在计算机系统中,数字的表示方法是数据处理的基石,直接关系到计算精度、效率与硬件成本。其核心原理在于如何用有限的二进制位高效、精确地表示各类数值,尤其是小数。定点数采用固定小数点位的思想,规则简单、运算速度快、硬件成本低,特别适合对确定性和实时性要求高的场景,如嵌入式系统、数字信号处理(DSP)和实时控制。浮点数则借鉴科学计数法,通过动态的指数和尾数分配,实现了极大的动态范围,是现代科学计算、图形渲染等通用计算的支柱,但其代价是存在固有的精度损失和舍入误差。理解定点数与浮点数的表示机制、运算特性及适用场景,是

weixin_34274029的博客 423

从深算一号到三号:海光DCU的技术演进与国产超算突围之路

本文梳理了海光DCU从深算一号到三号的技术演进历程,展现了国产高性能计算芯片从填补空白到追赶并行的突围之路。文章重点分析了深算系列在性能提升、软件生态(DTK)建设及超算平台构建方面的关键进展,并探讨了其在AI大模型训练、科学计算等领域的应用实践与未来挑战。

ipfs8storage的博客 1062

C# 中BigInteger的一种应用场景

用一个二进制字符串参数来表示多个状态位信息是一种节约空间的做法,比如三消游戏中的棋盘,每一个格子可能含有多种障碍或棋子,预先给每种障碍或棋子定义好编号,编号映射到二进制字符串上的索引,有出现就置为1;最后将这个二进制串转换为十进制的数值,就得到了一个长度短的多的字符串,做持久化或序列化时就大大减少了对空间的占用;这是一个经典的用时间换空间的操作,不过这个十进制数值可能非常大,远远超出一般数值类型的范围,所以就需要用到BigInteger 类型。

rjcql的专栏 830

智能座舱架构与芯片- (9) 音频篇 上

从A2B收发器衍生出来的简化产品具备各种级别的功能,例如端点从节点(不支持TDM)、简化型主节点(支持较短的电缆和更少的从节点数量),以及简化型端点从节点(支持较短电缆和更少的PDM输入)。例如,AVB中的talker和listener是不同的设备,它们的参考时钟源可能并不相同。传统的车载收音机通过天线接收无线电信号,然后由调谐模块(Tuner)进行信号调谐,信道过滤,信道均衡,多路改善,信号解调等,转为数字信号后再交给DSP进行立体声解码,噪声抑制,弱信号处理,最后从车载音响系统进行播放。

joanna_xiao的博客 4909

【亲测有效】OpenClaw Gateway 出现 “(no output)“ 卡死问题完整解决指南:从手动重启到 systemd Watchdog 自动恢复

最近在使用 OpenClaw(自托管 AI 助手框架,前身 Clawdbot/Moltbot)时,遇到了一个非常常见的顽疾:TUI(终端界面)或 Telegram 等通道经常显示 "(no output)",消息发出去后机器人完全没反应,看起来像是卡死了。

hampeter的博客 8610

BigInteger详解

在用C或者C++处理大数时感觉非常麻烦,但是在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。 这两个类都在java.math.*包中,因此每次必须在开头处引用该包。Ⅰ基本函数:1.valueOf(parament); 将参数转换为制定的类型比如 int a=3; Bi

Demo的博客 539

微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT

在大模型微调中,我们一般使用Alpaca 和 ShareGPT和两种格式的数据集。

Science prince的博客 1097

C# BigInteger 的使用

C# BigInteger 的使用

鲤籽鲲的博客 2277

【WRF-Chem Emissions教程第一期】WRF-Chem 排放概述

WRF-Chem 排放概述

WW、forever的博客 852

OSError We couldn‘t connect to https://huggingface.co to load file, couldn‘t find it chatglm3-6b解决方案

本文主要介绍了OSError: We couldn’t connect to https://huggingface.co to load this file, couldn’t find it in the cached files and it looks like THUDM/chatglm3-6b is not the path to a directory containing a file named config.json.解决方案,希望能对学习python的同学们有所帮助。

weixin_43178406的博客 5万+

C#常见的.Net类型(一)

当处理数字、文本和模式匹配时,C#提供了丰富的功能和灵活的工具。无论是处理简单的整数还是复杂的正则表达式,C#都能满足您的需求。

qq_42497776的博客 1749

【FPGA教程案例89】编译码2——使用vivado核实现RS信道编译码

RS编码,又称里所码,即Reed-solomon codes,是一种前向纠错的信道编码,对由校正过采样数据所产生的多项式有效。当接收器正确的收到足够的点后,它就可以恢复原来的多项式,即使接收到的多项式上有很多点被噪声干扰失真。

FPGA/MATLAB学习教程/源码/项目合作开发 3544

超越.NET极限-我做的高精度数值计算库

超越.NET极限-我做的高精度数值计算库还记得那一天,我大学刚毕业,紧张又兴奋地走进人生第一场.NET工作面试。我还清楚地记得那个房间的气氛,空调呼呼地吹着,面试官的表情严肃而深沉。我们进行了一番交谈:面试官,眼镜后的目光犀利:“你还有其它问题吗?”我,有点颤抖但决心坚定:“可惜C#只有大整数BigInteger,没有大小数。如果我想计算特别大或者特别精确的数字,C#就无能为力。你看Java那边,...

farway000的博客 196

16、Cortex-M7处理器:高性能与复杂架构解析

本文深入解析了Cortex-M7处理器的高性能架构与复杂设计,涵盖AHB总线矩阵优化、超标量六阶段双发射流水线、增强型分支预测单元及双精度浮点支持。重点介绍了其独特的内存层次结构,包括指令与数据TCM、片上缓存和AXI-M 64位总线接口,提升系统并行性与执行效率。通过实际测试对比M4与M7性能差异,并演示如何将代码与数据定位到TCM以实现零等待运行。同时阐述了缓存机制的工作原理及其对系统性能的影响,为开发者提供全面的性能优化指导。

a1b2c3d的博客 127

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Steam 挂刀行情站完整教程:64000 个饰品的跨平台价差与比例数据怎么读

SteamTradingSiteTracker(Steam 挂刀行情站)要解决的是一个很具体的问题:一件饰品挂在 Steam 市场卖,到底有没有差价可赚,哪一件饰品现在最值得关注。判断依据是同一件饰品在 BUFF、IGXE、C5、UUYP 四个第三方平台的实时报价。这个开源项目全天候自动采集这些报价,维护约 64000 个 CS:GO 与 DOTA2 饰品的挂刀比例数据,并把结果渲染成一张可筛选的

gitblog_00963的博客 366

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[转]浅谈 BigInteger

http://www.cnblogs.com/skyivben/archive/2008/07/13/1241681.html 最近一段时间,我在Timus Online Judge网站做 ACM 题。发现其中不少题目需要用到 BigInteger,例如: 1531. Zones on a plane 1013. K-based numbers....

weixin_34355881的博客 122

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

BigInteger和BigDecimal的应用场景

我们可以理解这两个类是“封装器”类型,但是这两个类却没有对应的“主类型”。比如 int a =4 那么 int就是主类型 1.int 或 float 做的事情,BigInteger和BigDecimal 一样可以做。 2.BigInteger支持任意精度的整数。也就是说,我们可精确表示任意大小的整数值,同时在运算过程中不会丢 失任何信息。 3.BigDecimal 支持任意精度的定点数字

a121155635的博客 820

高精度频率计模块:时间测量的硬件标尺与系统集成指南

频率计模块本质上是高精度时间测量设备,其核心能力在于纳秒乃至皮秒级的时间戳捕获与周期分析。它依赖晶体振荡器(如OCXO)、时间数字转换器(TDC)和实时校准算法构成完整硬件链路,解决信号边沿时刻判定、时钟稳定性与环境漂移补偿等基础问题。技术价值体现在为激光测距、5G同步、粒子探测等场景提供可信时间基准;在工业自动化、智能传感与分布式系统中,它支撑多源数据对齐、低抖动触发与PTP时间同步等关键应用。本文深入解析其硬件原理、接口设计(LVDS/JSON over TCP)及嵌入式集成实践,聚焦高精度与通用性两大

weixin_34081595的博客 346

C# 4.0 大数的运算,BigInteger

引用:  前段时间,有个同事说 “30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000

@ 1597

biginteger用法c语言,C#4.0提供BigInteger类 支持大数运算

【IT168资讯】前段时间,有个同事说“30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

weixin_29039773的博客 630

封装C# BigInteger随机数函数

所以,经过了一段时间的思考,我决定给大家分享这个函数的实现。编写一个函数,给定的参数为最小值。类并没有能与之配套的方法来生成。作为函数参数,所以需要引入。软件开源许可证,大家放心使用!但是,在某些情况下,遍历最高有效字节的位。

qq_73685232的博客 1165

二、Julia之变量与数据类型

文章目录一、变量二、数据类型2.1 整型1、类型强制限定2、有无符号转换2.2 布尔型2.3 浮点型1、零的表达2、epsilon3、无穷值4、非数值5、内置常量2.4 有理数型2.5 复数型2.6 随机数2.7 任意精度算术2.8 字符串2.8.1 字符2.8.2 String对象1、索引2、遍历3、子串2.8.3 变量替换2.8.4 正则表达式1、匹配2、提取2.8.5 常用操作1、连接2、比较3、搜索4、替换5、分割2.8.6 字节数组2.8.7 字符串与数值之间的转换 一、变量 在Julia中的一个

爱码者的博客 3695

C#和java在BigInteger类的一个不同。

C#对Java的代码翻译

weixin_45989580的博客 335

centos7 Python安装bigfloat库以处理高精度浮点数运算

记录下个小问题 这里使用的系统是centos7,python版本为python3.6 以下的python3,pip3命令应根据自己的设置调整 前提当然是已经安装配置好python和pip 直接尝试使用pip安装bigfloat库: pip3 install bigfloat 这里产生报错: building 'mpfr' extension creating bu...

qq_37913898的博客 1668

C# 存储超大的数字

static void Main(string[] args)         {             //存储超大的数字             System.Numerics.BigInteger numA = System.Numerics.BigInteger.Parse("9999999999999999999999999999999999999");            

菜刀居士的专栏 2663
上一篇: 六边形蜂巢的相关算法
下一篇: ECS打包IL2CPP常用的Linker
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值