美文网首页
[Android] sin/cos的问题

[Android] sin/cos的问题

作者: Cocoonshu | 来源:发表于2020-02-03 16:59 被阅读0次

    大家有没有遇到过这样的问题:
    我们做动画时,经常需要把时间经过三角函数变化为正/余弦波来做周期变动的动画。但当输入的时间值太大时,三角函数输出的值就不再变化了?

    首先我们看一下Java中三角函数的定义:

    /**
     * 正弦函数
     * @param x为正弦函数横坐标
     * @return 对应x值的正弦值
     */
    double Math.sin(double x);
    

    三角函数的输入输出都是double类型,再看看我们用来获取传入三角函数的时间的函数是怎么样的:

    /**
     * 获取从1970.1.1到现在的毫秒时间
     * @return 毫秒时间
     */
    long System.currentTimeMillis();
    

    时间函数返回的值是long类型的。

    那么当时间很大时,long类型的时间传入double类型的x形参会有什么问题么?
    double/float都是浮点数,Java等C风格语言中对浮点数的结构定义可以参考[Utils] IEEE754 浮点数定义标准。参照IEEE754标准定义的浮点数都有个特点,当整数部分的位数太多时,小数部分的位数就会变少。所以long型时间值过大后,传入Math.sin(time)/Math.cos(time)函数的time参数被默认强转为double后,小数部分的位数会少得可怜,甚至不再有小数部分。
    而三角函数对输入参数的变化定义域也只有0~3.1415...这个范围,于是传入三角函数的time参数就不怎么变化了,所以输出值也不怎么变化了

    相关文章

      网友评论

          本文标题:[Android] sin/cos的问题

          本文链接:https://www.haomeiwen.com/subject/ufaifqtx.html