相关疑难解决方法(0)

三角函数如何工作?

因此,在高中数学,也可能是大学,我们学习如何使用三角函数,他们做什么,以及他们解决了什么样的问题.但它们总是作为一个黑盒子呈现给我.如果你需要某些东西的正弦或余弦,你可以点击计算器上的sin或cos按钮然后进行设置.哪个好.

我想知道的是三角函数通常是如何实现的.

algorithm math trigonometry

99
推荐指数
4
解决办法
5万
查看次数

一起计算sin和cos的最快方法是什么?

我想一起计算一个值的正弦和正弦值(例如创建一个旋转矩阵).当然我可以一个接一个地分别计算它们a = cos(x); b = sin(x);,但我想知道在需要两个值时是否有更快的方法.

编辑: 总结到目前为止的答案:

  • 弗拉德说,有asm命令FSINCOS计算它们(几乎与FSIN单独呼叫同时)

  • Chi注意到的那样,这种优化有时已经由编译器完成(当使用优化标志时).

  • 咖啡厅指出,其功能sincossincosf可能是可用的,并且可以通过只包括直接调用math.h

  • 讨论使用查找表的 tanascius方法存在争议.(但是在我的计算机和基准测试场景中,它运行速度比sincos32位浮点几乎相同的速度快3倍.)

  • Joel Goodwin与一种极其快速近似技术的有趣方法相关联,具有相当好的准确性(对我来说,这比查表更快)

c c# c++ algorithm math

98
推荐指数
9
解决办法
2万
查看次数

在cmath中sqrt,sin,cos,pow等的定义

有没有像功能的任何定义sqrt(),sin(),cos(),tan(),log(),exp()(这些从文件math.h/CMATH)可用?

我只是想知道它们是如何工作的.

c c++ math cmath definitions

33
推荐指数
4
解决办法
2万
查看次数

为什么gcc数学库效率低下?

当我将一些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)

c performance gcc fortran archlinux

30
推荐指数
1
解决办法
3263
查看次数

numpy.cos在某些数字上的工作时间明显更长

TLDR:

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)

python benchmarking numpy

24
推荐指数
1
解决办法
558
查看次数

计算机如何计算平方根?

计算机如何计算平方根?我的意思是那里发生了什么!它是如何处理的!! 它是否使用像牛顿方法那样的数学方法?三角函数怎么样?几乎所有那些数学函数.在每种语言都有自己的方式的情况下,请让我们谈谈c ++.

c++ math process low-level square-root

23
推荐指数
4
解决办法
2万
查看次数

c ++数学库pow()函数的时间复杂度?

我想知道用c ++构建的pow()函数的最坏情况时间复杂度是多少?

c++ time-complexity

23
推荐指数
1
解决办法
1万
查看次数

为什么在matlab中sin(pi)不精确但sin(pi/2)是准确的?

我的计算有问题matlab.我知道" pi"是一个浮点数并不准确.所以,在matlab sin(pi)中并不完全为零.我的问题是,如果" pi"不确切,那么为什么sin(pi/2)完全相同1.

sin(pi)- >不完全是因为pi.但 sin(pi/2)完全相同1

我很奇怪和困惑!

precision matlab pi function

18
推荐指数
1
解决办法
1784
查看次数

如果参数大小大于8192,为什么numpy.sin返回不同的结果?

我发现,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)

python numpy intel-mkl anaconda

14
推荐指数
1
解决办法
412
查看次数

matlab和c ++中的精度差异

我试图对用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++ floating-point precision matlab

10
推荐指数
2
解决办法
5007
查看次数