设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3231|回复: 5
打印 上一主题 下一主题

[已经解决] 数学中的tan、sin、cos和ruby中的不同,怎么在ruby上计算?

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
58 小时
注册时间
2011-8-21
帖子
51
跳转到指定楼层
1
发表于 2011-10-2 13:24:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用计算机输入tan(45)会显示1,电脑上输入Math.tan(45)会返回1.619775左右的数,怎么在ruby上实现数学中的tan、sin、cos计算呢?

Lv1.梦旅人

梦石
0
星屑
50
在线时间
237 小时
注册时间
2011-7-28
帖子
81
2
发表于 2011-10-2 13:32:30 | 只看该作者
45度=PI/4 = 3.14/4 !=45
看看网络,数不清的信息扑面而来,你知道了什么是冗余;看看每一天的生活,日复一日,许多的无奈,你理解了什么是缺陷;生命里充满了不可预知,明天将发生什么,谁也不知道,这就是动态。 ...
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1190
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

3
发表于 2011-10-2 14:27:49 | 只看该作者
本帖最后由 DeathKing 于 2011-10-2 14:28 编辑

Ruby(以及大多数语言一样),所使用的三角函数期望接受的是一个弧度数,而不是角度数。因此,求取45°角,你可以按照下面的方法:
  1. Math.tan(Math::PI/4)
复制代码
考虑到弧度与角度的转换关系:Arc = Degree / 180 * PI,可以定义下面的脚本,从此,可以使用xxxd形式的三角函数来计算某个角度的三角函数:
  1. module Math
  2.   def self.d2a(degree)
  3.     return degree.to_f * PI / 180
  4.   end
  5.   def self.a2d(arc)
  6.     return arc.to_f * 180 / PI
  7.   end
  8.   def self.sind(d)
  9.     return sin(d2a(d))
  10.   end
  11.   def self.cosd(d)
  12.     return cos(d2a(d))
  13.   end
  14.   # 其他三角函数诸此
  15. end
复制代码

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
58 小时
注册时间
2011-8-21
帖子
51
4
 楼主| 发表于 2011-10-2 16:11:16 | 只看该作者
本帖最后由 受pia专用ID 于 2011-10-4 18:50 编辑
DeathKing 发表于 2011-10-2 14:27
Ruby(以及大多数语言一样),所使用的三角函数期望接受的是一个弧度数,而不是角度数。因此,求取45°角, ...


t1 = Time.now
1000000.times {
  a = Math.sind(32.574915436)
}
p Time.now - t1 # 显示2.844
t1 = Time.now
1000000.times {
  a = Math.sin(32.574915436)
}
p Time.now - t1 #显示0.813
t1 = Time.now
1000000.times {
}
p Time.now - t1 #显示0.109
方法挺好,不过经上面的脚本测试sind的速度差不多是sin的1/3到1/4,我觉得我该学学弧度算法,这样快一点。

我的确得在意效率,两个原因:
1.我家电脑卡。
2.如果效率高,我做的系统可以同时容纳更多敌人,更多事件,更多子弹,有更大的地图。
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1190
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

5
发表于 2011-10-2 22:47:34 | 只看该作者
受pia专用ID 发表于 2011-10-2 16:11
t1 = Time.now
1000000.times {
  a = Math.sind(32.574915436)

考虑到Math::PI已经是个浮点数了,所以可以不需要显式的转化。所以代码可以优化为下述模式:
  1. module Math
  2.   def self.d2a(degree)
  3.     return degree * PI / 180
  4.   end
  5.   def self.a2d(arc)
  6.     return arc * 180 / PI
  7.   end
  8.   def self.sind(d)
  9.     return sin(d2a(d))
  10.   end
  11.   def self.cosd(d)
  12.     return cos(d2a(d))
  13.   end
  14.   # 其他三角函数诸此
  15.   
  16.   # 不借助与其他方法的One-line版
  17.   def self.ssind(d)
  18.         return sin(d * PI / 180)
  19.   end
  20. end
复制代码
而你的测试使用的是两个意义上不同的值,所以不能作为比较的依据。我采用了Ruby内置的Benchmark模块,给出了一个精度很高的结果。测试的是求取45°角(π/4弧度)的正弦值。

环境是Ruby 1.9.2,OS是Windows XP Professional,测试结果如下:
  1. Rehearsal -----------------------------------------------------------
  2. sin(0.7853981633974483)   0.125000   0.000000   0.125000 (  0.125000)
  3. sin(Math::PI / 4)         0.187000   0.000000   0.187000 (  0.187500)
  4. sind(45)                  0.281000   0.000000   0.281000 (  0.281250)
  5. ssind(45)                 0.266000   0.000000   0.266000 (  0.265625)
  6. -------------------------------------------------- total: 0.859000sec

  7.                               user     system      total        real
  8. sin(0.7853981633974483)   0.125000   0.000000   0.125000 (  0.125000)
  9. sin(Math::PI / 4)         0.187000   0.000000   0.187000 (  0.187500)
  10. sind(45)                  0.281000   0.000000   0.281000 (  0.281250)
  11. ssind(45)                 0.266000   0.000000   0.266000 (  0.265625)
  12. #--- 检测三个方法的输出是否一致
  13. 0.7071067811865475
  14. 0.7071067811865475
  15. 0.7071067811865475
  16. 0.7071067811865475
复制代码
得到的结果是,如果不是采用一个弧度的立即值,sind花的时间是sin的两倍(大概是花在方法的跳转上)。不过建议是,如果不是涉及到诸如3D游戏设计,就不要去在意效率了,何必把自己弄得如此苦逼呢?

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
6
发表于 2011-10-3 00:37:12 | 只看该作者
最好还是现在就把把计算思维从角度转到弧度上。除了某些几何问题以外,数学也很少会用到角度,因为用弧度做很多计算时能使表达式以一种自然的形式呈现。像三角函数的泰勒展开式,欧拉公式等在参数是弧度时,最后得出的式子就简单明了,而如果用角度作参数,表达式各项通常就会多出诸如 PI/180 这样的额外因数,最后得出的式子就很难看。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-1 00:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表