因此,在高中数学,也可能是大学,我们学习如何使用三角函数,他们做什么,以及他们解决了什么样的问题.但它们总是作为一个黑盒子呈现给我.如果你需要某些东西的正弦或余弦,你可以点击计算器上的sin或cos按钮然后进行设置.哪个好.
我想知道的是三角函数通常是如何实现的.
我想一起计算一个值的正弦和正弦值(例如创建一个旋转矩阵).当然我可以一个接一个地分别计算它们a = cos(x); b = sin(x);,但我想知道在需要两个值时是否有更快的方法.
编辑: 总结到目前为止的答案:
有没有像功能的任何定义sqrt(),sin(),cos(),tan(),log(),exp()(这些从文件math.h/CMATH)可用?
我只是想知道它们是如何工作的.
当我将一些fortran代码移植到c时,令我感到惊讶的是,使用ifort(intel fortran编译器)编译的fortran程序与使用gcc编译的c程序之间的大部分执行时间差异来自于对三角函数的评估(sin,cos).这令我感到惊讶,因为我曾经相信这个答案解释的是,正弦和余弦等函数是在微处理器内部的微码中实现的.
为了更明确地发现问题,我在fortran做了一个小测试程序
program ftest
implicit none
real(8) :: x
integer :: i
x = 0d0
do i = 1, 10000000
x = cos (2d0 * x)
end do
write (*,*) x
end program ftest
Run Code Online (Sandbox Code Playgroud)
在intel Q6600处理器上,3.6.9-1-ARCH x86_64 Linux
我得到了ifort version 12.1.0
$ ifort -o ftest ftest.f90
$ time ./ftest
-0.211417093282753
real 0m0.280s
user 0m0.273s
sys 0m0.003s
Run Code Online (Sandbox Code Playgroud)
而与gcc version 4.7.2我得到
$ gfortran -o ftest ftest.f90
$ time ./ftest …Run Code Online (Sandbox Code Playgroud) numpy.cos()在特定数字上(例如24000.0),其工作时间延长了30%。加一个小增量(+0.01)可使numpy.cos()照常工作。
我不知道为什么。
在与一起工作时,我偶然发现了一个奇怪的问题numpy。我正在检查缓存工作,并意外制作了错误的图形- numpy.cos(X)时间取决于时间X。这是我修改后的代码(从我的Jupyter笔记本复制):
import numpy as np
import timeit
st = 'import numpy as np'
cmp = []
cmp_list = []
left = 0
right = 50000
step = 1000
# Loop for additional average smoothing
for _ in range(10):
cmp_list = []
# Calculate np.cos depending on its argument
for i in range(left, right, step):
s=(timeit.timeit('np.cos({})'.format(i), number=15000, setup=st))
cmp_list.append(int(s*1000)/1000)
cmp.append(cmp_list)
# Calculate average times
av=[np.average([cmp[i][j] for i in range(len(cmp))]) …Run Code Online (Sandbox Code Playgroud) 计算机如何计算平方根?我的意思是那里发生了什么!它是如何处理的!! 它是否使用像牛顿方法那样的数学方法?三角函数怎么样?几乎所有那些数学函数.在每种语言都有自己的方式的情况下,请让我们谈谈c ++.
我的计算有问题matlab.我知道" pi"是一个浮点数并不准确.所以,在matlab sin(pi)中并不完全为零.我的问题是,如果" pi"不确切,那么为什么sin(pi/2)完全相同1.
sin(pi)- >不完全是因为pi.但
sin(pi/2)完全相同1
我很奇怪和困惑!
我发现,numpy.sin当参数大小小于等于8192且大于8192时,行为会有所不同。性能和返回的值都不同。有人可以解释这种影响吗?
例如,让我们计算sin(pi / 4):
x = np.pi*0.25
for n in range(8191, 8195):
xx = np.repeat(x, n)
%timeit np.sin(xx)
print(n, np.sin(xx)[0])
Run Code Online (Sandbox Code Playgroud)
64.7 µs ± 194 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
8191 0.7071067811865476
64.6 µs ± 166 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
8192 0.7071067811865476
20.1 µs ± 189 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
8193 0.7071067811865475
21.8 …Run Code Online (Sandbox Code Playgroud) 我试图对用C++和Matlab编写的算法进行等价测试.该算法包含某种循环,运行时间超过1000次.它具有算术运算和一些数学函数.
我手动将初始输入馈送到两个平台(如a = 1.767,b = 6.65,...),当我检查这些输入的十六进制表示时,它们是相同的.所以输入没问题.并通过一个带有16位十进制数字的文本文件将c ++的输出输出到matlab.(我使用"setprecision(32)"声明)
但问题出在这里; 虽然在两个代码的第614步之后,所有的结果都完全相同,在615的步骤中我得到了关于2.xxx..xxe-19的差异?在此步骤之后,错误变得越来越大,并且在运行结束时它大约是5.xx..xxe-14.
0x3ff1 3e42 a211 6cca ---> [C++函数] ---> 0x3ff4 7619 7005 5a42
0x3ff1 3e42 a211 6cca ---> [MATLAB函数] ---> ans
ans - 0x3ff4 7619 7005 5a42
= 2.xxx..xxe-19
我搜索了matlab如何表现数字并发现了非常有趣的东西,比如"非规范化的尾数".虽然realmin是关于e-308的,但通过对尾数进行非规范化,matlab具有关于e-324的最小实数.进一步的matlab比"c ++"拥有更多的"pi"或"exp(1)"数字.
另一方面,matlab帮助说无论它显示什么格式,matlab都在内部使用双精度.
所以,如果有人解释这些差异的确切原因,我真的很感激?我们如何在matlab和c ++上进行等价测试?
c++ ×5
math ×4
c ×3
algorithm ×2
matlab ×2
numpy ×2
precision ×2
python ×2
anaconda ×1
archlinux ×1
benchmarking ×1
c# ×1
cmath ×1
definitions ×1
fortran ×1
function ×1
gcc ×1
intel-mkl ×1
low-level ×1
performance ×1
pi ×1
process ×1
square-root ×1
trigonometry ×1