MicroBlocks不喜欢小数运算,凡涉及浮点数的C函数都不公开。但是它偷偷地在Misc Primitives库里面把正弦sine和反正切arctan给公开了,这为我们实现其他三角函数运算提供了一种蠢蠢的思路。
我试验了一下,在锐角至少在75°的范围内,误差都能接受。
先用这两个函数把正切函数实现了。这可以使用循环穷举的办法:设想直角三角形的两个直角边,邻边x取1000,对边y的取值即为放大了1000倍的正切值。
有了tan函数,cos就容易了。
在上面的计算过程中,为了避免计算过程中就丢失精度,有的是先乘了1000,计算完毕再除以1000。MicroBlocks里面的三角函数都是给角度增加100倍计算的,我们给它折算到1000倍,基本上能较大程度上保证计算精度。
现在尝试5°、15°、30°、45°、60°、75°、85°这几个角度的计算值。
表格里面的数据是Excel计算的,下面的则是MicroBlocks的,因为我们已经把计算结果放大了1000倍,相当于小数点第3位才出现误差,看来是可以接受的。只是到了85°附近的时候,误差嗷一下子就上去了,这个计算值就没法用了。
module 'tan_cos.ubp'
author '阿璇'
version 1 0
depends miscPrims
description ''
variables x1000y
spec 'r' 'x1000y' 'tan _' 'auto' 4500
spec 'r' 'cos' 'cos _' 'auto' 3000
to cos my_angle {
return ((((1000 * ('[misc:sin]' my_angle)) / 16384) * 1000) / (x1000y my_angle))
}
to x1000y angle {
x1000y = 0
forever {
if ((absoluteValue (((('[misc:sin]' ('[misc:atan2]' 1000 x1000y)) - ('[misc:sin]' angle)) * 1000) / 16384)) < 2) {
return x1000y
} else {
x1000y += 1
}
}
}
联系客服