作业帮 > 综合 > 作业

VB中SQR函数的结果最多只能有15个有效数字.有什么其他的函数可以保留更多的有效数字?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/20 10:31:09
VB中SQR函数的结果最多只能有15个有效数字.有什么其他的函数可以保留更多的有效数字?
VB中SQR函数的结果最多只能有15个有效数字.就算用 x^(1/2)来开方,也是只有15个有效数字.有什么其他的函数可以保留更多的有效数字?
这个运算结果是由数据类型决定的,跟函数没有任何关系.Double是VB6中最大的数据类型,支持15位有效数字.还有一种特殊的数据类型Decimal,支持28位小数,但运算效率很低,所以连VB本身都是不推荐使用的.
VB(包括其他任何编程语言)是用固定的内存字节来储存数字的,比如整型(Integer)是2个字节,长整型(Long)是4个字节,单精度浮点型(Single)是4个字节,双精度浮点型是8个字节,Decimal型是14个字节,等等.既然是固定的长度,那么就肯定不可能储存任意长度的数字,肯定是有有效数字的限制的.
再问: 十进制的15位数化成二进制也只是47个字符,一个字节可以储存1,024个字符啊,难道位数和字符有什么其他关系 = =

还是我理解错了。。。?
再答: 十进制的15位数化成二进制也只是47个字符十进制的15位数只能用Double型保存,而Double型是8个字节(相当于8个字符的长度),化成二进制是64位(bit)。我不知道你的说法是从何而来的。
一个字节可以储存1,024个字符
这个就错得非常离谱了。1Byte = 8bit   (1字节=8位,或者说8比特)1KB = 1024B   (1024个字节就是1KB)
1MB = 1024KB1GB = 1024MB1TB = 1024GB一个字节只能储存一个半角字符,或半个全角字符(如果是UTF-8编码则有可能是三分之一个字符),怎么可能1024个字符
所以我觉得你对数位、进制、字节、字符等等基础知识还完全不懂,而不是理解错的问题。先把这些知识掌握好再说吧。
下面是VB中的各种数据类型的范围:

再问: 额,好像晓得了一点。但是具体要怎么解决呢,现在我用开方的竖式改成算法,可以突破15位的限制(不当成数字而当成字符串),就是每计算一位就附在结果的后面,如:根号三的小数点后80位P.S  顺便问一下,用String型按这种方法是不是可以储存到"1."后面 (20亿-2) 位。。这样能算出开方后的小数,但是一参与运算又会变成15位有效数字。。能不能换成其他种类型的数据,让有效数字变长一点?

再答: 电脑计算器用的数据类型就是Decimal,最后三位059已经不是精确数字而是约数。从这里可以看出,连微软自己的软件都无法突破有效数字的限制,所以你可以死心了,洗洗睡吧!
用字符串可以储存精确计算的结果,但如果参与运算的话,必然要转化为数值,这样就回到有效数字限制的老路上了。
用字符串储存数字,最大位数实际上是2G(即2*1024*1024*1024,约为21亿多),这是因为VB是32位的,最大只能调用2G的内存。当然实际大小是受物理内存的限制的。
换一个角度来想一下:储存一个数字就要2G的内存,再要进行计算的话,要多少内存?而且其他程序和数据又放在哪里呢?
因此,要想在个人电脑(PC)中储存和计算无限位数的精确数值运算是绝对不可能的,只能指定有限的位数,比如8个字节、16个字节等,这样就必然会有有效数字的限制。
要先真正实现精确计算,只能用大型计算机,比如银河。
再问: 额。。061会约成059么。。。
好像看过有人说excel中ROUND的约等并不是四舍五入,而是四舍六入五成双什么的,跟这个有没有关系额?

微软的计算器已经精确到32位有效数字了。。是有不同的算法还是用的类型不一样?
再答: 我上面已经说了,微软计算器是精确到小数点后28位,加上个位数,实际有效数字就是29位,最后三位是浮点数误差的纠偏算法,已经不是精确数字,但它与四舍五入和四舍六入五成双都无关。
关于四舍六入五成双,是当要取舍的位数值是5时,将转为最接近的偶数,要验证用不着excel的Round,VB6本身就有Round函数,你在立即窗口输入如下命令验证就行:
?round(2.55,1) '2.55保留一位小数
2.6 '结果是2.6
?round(2.65,1) '2.65保留一位小数
2.6 '结果仍然是2.6
此外VB的CInt()函数以及\整除等等也是采用四舍六入五成双算法的
再问: 奥。。我找到原因了。
按你那么说,微软的计算器算到那个位数的有效数字可能是错的么?
不过我那个算法就从中间就是错的了
因为 d*(d+20b) 就只能是精确到15位有效数字,所以这之后算的都不是对的。