主题:VB中有没有π的函数,类似于VFP中的PI()
hongbawudi
[专家分:260] 发布于 2008-06-04 16:49:00
如题,正在编个计算器,其中的三角函数值想用角度表示,但对π的处理一直不满意,自定义的π精度再高,三角函数sin(π)都只能小到
?sin(3.1415926535897932)
1.22460635382238E-16
这个数,想让它等于0,但在较大的倍数计算时,误差不要太大!
回复列表 (共7个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2008-06-04 17:30:00
vb里,最精确的浮点数,就是“双精度数”相对误差就是那么多。这个基本不可克服。
你要在别处搞那个“倍数”,只能通过优选“算法”来减小误差的积累。
板凳
老大徒伤悲 [专家分:29120] 发布于 2008-06-04 17:32:00
另,用在三角函数里实际上大家更习惯使用“度”为单位。
你可以对“度”取出周角的整数倍后,在转化为弧度计算。
3 楼
我是大喊三 [专家分:3010] 发布于 2008-06-04 23:08:00
从位数来看,这个sin()函数返回的应该是双精度浮点吧,也就是精确到十多位了。想让那个很小的数等于零,是不是可以将它赋给一个整型变量看看。
4 楼
老大徒伤悲 [专家分:29120] 发布于 2008-06-05 08:22:00
看来,我理解错了楼住的意思,还是“喊山”理解的对。
那么怎么处理呢?如果取整的话,显然,精度损失太大。就稍微牺牲一点精度算了,取14位,基本可以说是在避免了储存误差的同时“最大限度”地保留了计算结果。
?round(sin(弧度值),14)
楼住看看,这次理解对不对?
5 楼
okbaby [专家分:100] 发布于 2008-06-06 15:53:00
参考IEEE754中浮点数的在内存中的格式,浮点数和整数不一样,浮点数在内存中分为两部分来保存,一部分是数值,另一部分是缩放倍率,例如single类型(c中的float,fortran中的Real*4),在内存中的长度为4字节(32位),其格式如下:
31 30~23 22~0
S | e |m
其中0~22位存储一个无符号整形数值,23~30存储一个整形数值,第31位存储数值的符号(+或-),数值按下面的公示计算:
float_V=m*2^e
符号由S确定。
看到这里估计你应该明白为什么你的程序不能输出更高精度的数值了,应为m的长度确定了它的长度。
另外如果你需要更高精度的数值,可以仿照上面的定义,自己定义你的数据类型,自己负责字符串到数值的转换,以及数学运算。
我想windows自带的计算器或许就是采用的这种方法,它计算精度比使用double类型高多了。
6 楼
我是大喊三 [专家分:3010] 发布于 2008-06-07 23:24:00
好象VB中还有decimal类型,不过怎么用我没用过
资料--------------------------------------------------------
Decimal 变量存储为 96 位(12 个字节)无符号的整型形式,并除以一个 10 的幂数。这个变比因子决定了小数点右面的数字位数,其范围从 0 到 28。变比因子为 0(没有小数位)的情形下,最大的可能值为 +/-79,228,162,514,264,337,593,543,950,335。而在有 28 个小数位的情况下,最大值为 +/-7.9228162514264337593543950335,而最小的非零值为 +/-0.0000000000000000000000000001。
注意 此时,Decimal 数据类型只能在 Variant中使用,也就是说,不能声明一变量为 Decimal 的类型。不过可用 Cdec 函数,创建一个子类型为 Decimal 的 Variant。
7 楼
hongbawudi [专家分:260] 发布于 2008-06-08 19:27:00
谢谢各位,受教了!
我来回复