自己做的一个c#超大浮点数bigFloat
当下有很多超大数值的游戏,就目标的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 + a1a0 - a1a0 * a1a0 / a1转载或者使用请勿删除出处https://blog.csdn.net/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,000private 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.234e2if (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如果为空,则返回falseif (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);elsereturn 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的,需要改为大于1string 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代表1ifind += 1;int e = int.Parse(e_str.Substring(ifind)) - intExtendPower; //减去3是因为1000代表1b._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个0int 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;elselen = 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; //多小数点elselen = 9; //负数if (newb >= 0)outStr = string.Format("{0}.{1}", newb / intExtendMultiply, newb % intExtendMultiply);elseoutStr = 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;elsereturn 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;elsereturn 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#超大浮点数bigFloat相关推荐
- python换脸完整程序_小 200 行 Python 代码做了一个换脸程序
原标题:小 200 行 Python 代码做了一个换脸程序 简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: ...
- IPO的京东数科,不做下一个蚂蚁金服
作者:中国软件网 陈杨 校对:中国软件网 海策 同样以电商发家的京东.阿里,二者从成立那天起便注定"摩擦"不断. 时至今日,京东.淘宝.天猫已成为大家生活中不可或缺的一部分,二者之 ...
- 090613 今天做了一个软件没搞定的RAID5
今天做了一个RAID5 ,之前一个人用<**恢复大师>.<r-studio>以及<RAID Reconstructor>反正能用的软件都用过了,最后的结果是恢复出来 ...
- ACMNO.2 输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9 输出要求有文字说明,取位2小数。 输入 一个华氏温度,浮点数 输出 摄氏温度,浮点两位小数
题目描述 输入一个华氏温度,要求输出摄氏温度.公式为 c=5(F-32)/9 输出要求有文字说明,取位2小数. 输入 一个华氏温度,浮点数 输出 摄氏温度,浮点两位小数 样例输入 -40 样例输出 c ...
- c语言写的跳转心理测试,求各位大神赐教!我做了一个“心理测试的答题卷”编程,总共有1...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求各位大神赐教!我做了一个"心理测试的答题卷"编程,总共有10道题,每道题有3个供选择的答案,每个答案得分从小到大是8分.5分和3分, ...
- 基于阿里云用C/C++做了一个http协议与TCP协议的web聊天室的服务器——《干饭聊天室》
基于阿里云用C/C++做了一个http协议与TCP协议的web聊天室的服务器--<干饭聊天室> 在这里首先感谢前端小伙伴飞鸟 前端技术请看一款基于React.C++,使用TCP/HTTP协 ...
- 最近做了一个博客 玩玩而已 运城搜搜 www.lenovoyh.com
最近做了一个博客 玩玩而已 运城搜搜 www.lenovoyh.com 用了以前一个没用的域名做的 现在还没排名 等待吧 呵呵 转载于:https://www.cnblogs.com/kiah/a ...
- 用c语言编写心里测试,求各位大神赐教!我做了一个“心理测试的答题卷”编程,总共有1...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求各位大神赐教!我做了一个"心理测试的答题卷"编程,总共有10道题,每道题有3个供选择的答案,每个答案得分从小到大是8分.5分和3分, ...
- 做了一个系列的Android开发教程列表
做了一个系列的Android开发教程列表.花了半天多的专题 里面包含了 4个系列的教程. 也包含了很多Android开发资料. 喜欢的人可以收藏哦:http://dev.apkbus.com/
最新文章
- VirtualBox: Effective UID is not root
- python之路---25 模块和包
- 怎样推断一棵树是否是平衡二叉树
- keygen基本流程
- bash/shell的字符串trim实现
- C++实现输出内容存入到TXT文档中
- Linux系统挂载NTFS文件系统
- 华为手机相册怎么镜像翻转_怎么利用手机相册制作电子视频
- 考研 | 先预览一下考研真题是考研小白最快的入门方法(含21考研最新真题)
- one command 一键收集 oracle 巡检信息(包括dbhc,awr reports)
- 交互设计实用指南系列(9)— 一次点击
- poj 2263 Heavy Cargo floyd基础,就是输入的时候处理字符串纠结一点!!!!
- Javascript:基础语法
- 温故知新----css布局
- mysql字符校对规则作用_(2)MySQL字符集及校对规则的理解
- 计算机联锁怎么排进路,计算机联锁进路选排设计
- 反思:为什么你做淘宝客不赚钱
- selenium 的显示等待与隐式等待
- html显示latex公式,wordpress显示数学公式插件【LaTeX转HTML】
- 怎么查看当前登录的svn账号_svn 用户名,密码 查看/删除方法