返回目录:excel表格制作
1。IEEE的浮点转换
起因是朋友工作需要做IEEE的浮点计算和数制转换,手工XXXX一两个没关系,多了就吐血....
IEEE的浮点,常见的是4BYTE一组这种,和VB对应的SINGLE单精度型。在C/C++里直接就用结构转换了。以前的VB里,也有用WINAPI COPYMEMORY实现的(在modIEEE2里有一个),不过这里用的是modIEEE1那个模块,VBA自已的LSET语句,原理上差不多。
演示里用函数实现,在表1里B2和B4两个中文名函数,很简单,注意16进制的BYTE是低位在前,高位在后的字符。
2。数制之间的转换
所有函数和常数都定义在模块modNsys里,和IEEE没关系。
主要的函数是两个,
NtoVal(N进制字符串, 可选的N进制值) '后面那个默认的进制是16
例如 Ntoval("1f") 得到31
ValtoN(数值, 可选的N进制值, 可选的小数精度) '默认的进制是16,小数默认是4
例如 valtoN(256) 得到100
比如10进制与16进制,2进制与8进制啦,3进制与10进制啦,以至N进制与X进制
不过这里的模块,用的是36以内的N进制。
原因很简单,你们看代码里,我的那个常数字符串(提供集合)的只有0-10,A-Z,MAXN常数也只有36,要扩展可以自已扩展。
(当然也可以把字符打乱,比如开始的字符用"98765%#2*"之类代替0123456789,不过会把自已搞晕了就是,又不是密码学)
可以做N进制小数转换。超出16进制的,大家可能不习惯,比如17进制,多了个G字符——当然,前面说过了,你要是没事干,用其它字符代替G,比如“囧”代替G,那么17进制里,每一阶的16这个数值(相当于10进制的9,16进制的F),就会变成囧了....
加了N多的注释,算法没有优化,和IEEE不同,是老老实实用阶乘的算法转换。
在表1的A列和B列有一堆进制转换的例子,公式引用函数在B列