- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面的代码演示了 atan 的计算时间可以有很大的不同:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
double get_time()
{
struct timeval t;
struct timezone tzp;
gettimeofday(&t, &tzp);
return t.tv_sec + t.tv_usec*1e-6;
}
int main() {
double worst_time = 0.0;
double best_time = 1e6;
volatile double x0 = -M_PI/2.0;
volatile double foo = atan(x0); // SLOW CALL HERE
volatile double sum = 0.0; // volatile to avoid having tan() call optimized away
for (double x = x0; x < M_PI/3.0; x += 0.1) {
volatile double y = x;
const double start = get_time();
asm volatile ("":::"memory"); // avoid reordering in -O3
const double value = atan(y);
asm volatile ("":::"memory"); // avoid reordering
const double end = get_time();
sum += value;
const double delta = end - start;
if (delta > worst_time) {
worst_time = delta;
}
if (delta < best_time) {
best_time = delta;
}
printf("* %f (value: %f)\n", delta, y);
}
printf("%f / %f\n", worst_time, best_time);
printf("%f\n", foo);
}
从我的机器来看,最差时间约为 15us,而最佳时间为 0(太小而无法测量)。
我机器上的平均时间(此处未显示)约为 1 或 2 us。
我尝试了不同的编译标志(-O3、静态链接到 libm 等),但我找不到导致最坏时间变慢的原因。有什么想法吗?
编辑:我使用的是 Ubuntu 14.04 - gcc 4.8.4
edit2:用 atan 替换 atan2。我对 atan2 是分段定义的事实不感兴趣,不同的分支可能需要不同的时间。我有兴趣消除即使调用 atan 而不是 atan2 也会出现的异常值。
编辑3:
* 0.000015 (value: -1.570796)
* 0.000000 (value: -1.470796)
* 0.000001 (value: -1.370796)
* 0.000001 (value: -1.270796)
* 0.000000 (value: -1.170796)
* 0.000002 (value: -1.070796)
* 0.000000 (value: -0.970796)
* 0.000001 (value: -0.870796)
* 0.000000 (value: -0.770796)
* 0.000000 (value: -0.670796)
* 0.000001 (value: -0.570796)
* 0.000000 (value: -0.470796)
* 0.000003 (value: -0.370796)
* 0.000001 (value: -0.270796)
* 0.000000 (value: -0.170796)
* 0.000000 (value: -0.070796)
* 0.000001 (value: 0.029204)
* 0.000000 (value: 0.129204)
* 0.000002 (value: 0.229204)
* 0.000001 (value: 0.329204)
* 0.000000 (value: 0.429204)
* 0.000001 (value: 0.529204)
* 0.000001 (value: 0.629204)
* 0.000001 (value: 0.729204)
* 0.000001 (value: 0.829204)
* 0.000001 (value: 0.929204)
* 0.000000 (value: 1.029204)
0.000015 / 0.000000 / 0.000001
编辑4:
看来第一个电话是罪魁祸首!循环外的调用被编译器优化掉了,如果我们强制在循环外为 x0
计算 atan,所有调用都相当快......
* 0.000000 (value: -1.570796)
* 0.000001 (value: -1.470796)
* 0.000000 (value: -1.370796)
* 0.000002 (value: -1.270796)
* 0.000001 (value: -1.170796)
* 0.000001 (value: -1.070796)
* 0.000000 (value: -0.970796)
* 0.000000 (value: -0.870796)
* 0.000000 (value: -0.770796)
* 0.000001 (value: -0.670796)
* 0.000000 (value: -0.570796)
* 0.000000 (value: -0.470796)
* 0.000006 (value: -0.370796)
* 0.000001 (value: -0.270796)
* 0.000002 (value: -0.170796)
* 0.000001 (value: -0.070796)
* 0.000000 (value: 0.029204)
* 0.000001 (value: 0.129204)
* 0.000003 (value: 0.229204)
* 0.000000 (value: 0.329204)
* 0.000000 (value: 0.429204)
* 0.000000 (value: 0.529204)
* 0.000001 (value: 0.629204)
* 0.000000 (value: 0.729204)
* 0.000000 (value: 0.829204)
* 0.000000 (value: 0.929204)
* 0.000000 (value: 1.029204)
0.000006 / 0.000000
最佳答案
时间差异实际上是由页面错误(!)引起的。第一次调用该函数时,访问包含atan2代码的页面并发生页面错误。使用 mlockall() 应该可以改善这种情况。
关于c - 为什么 atan 的第一个调用比下一个慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31467813/
我必须做一些需要使用三角函数的计算,尤其是 atan一。代码将在 Atmega328p 上运行,为了效率,我不能使用 float s:我使用的是定点数。因此,我不能使用标准 atan功能。 我有一个函
我一直在谷歌上搜索这个问题的解决方案。我见过多种计算任何 -1 #include double my_atan(double x) { return x - (x*x*x)/3 + (x*
我正在用 JavaScript 编写我的第一个项目。据我了解,Math.atan() 返回一个数字(以弧度表示的 Angular )。但不知何故,它返回了 Nan。 使用console.log(),我
我遇到 Math.atan 返回与输入相同的值的问题。 public double inchToMOA( double in, double range){ double rangeI
这里是一位非常初级的程序员(两周前开始),我目前在使用 Math.atan 时遇到问题。我目前使用 Eclipse IDE,并且一直在尝试找出如何对三角形执行 tan^-1,但目前不起作用。我在控制台
下面的代码演示了 atan 的计算时间可以有很大的不同: #include #include #include #include #include #include double get_
我有以下小程序,它在我的大型项目中重现了一个触发错误: #define _USE_MATH_DEFINES #include #include #define R2D(trig_fn, val)
我在我的代码中得到了这个函数: -(void)printAngle { int width = p2_t.x-cp1_t.x; int height = p2_t.y-cp1_t.y;
我有个小问题我不知道如何在 cobol 中转换我的 ATAN/ASIN/ACOS 函数这是代码: ACCEPT A
我试图在点的 Angular 之间做一些比较,但很快我遇到了一些奇怪的结果。 在这个例子中,我尝试旋转线条,使它们指向中心,但线条的 Angular 似乎超过了它们应该很快的 Angular 。然后,
我正在尝试计算一个实体观看另一个实体时必须观察的角度。 l是第一个实体的位置。 o是另一个实体的位置。 每个实体在 3D 空间中都有一个 3D X、Y 和 Z 坐标。 我目前使用 double ang
这个问题已经有答案了: What is the difference between atan and atan2 in C++? (11 个回答) 已关闭 6 年前。 我有一个问题。 atan 和有
我如何将我的 atan 函数放入 atan2 中?例如 float myAtan2(double a, double b) { float atan2val = //calculate ata
Java Math.atan() 函数是否已知有任何问题?我在我的代码中使用它,由于一些我无法解决的奇怪原因,该函数将在 45 度运动时返回 0,跳转到 45 并保持在 45 直到它达到 63.4 度
我在一些基本的触发方面遇到了一些麻烦。我正在做一些数学作业,我终于厌倦了将直角坐标转换为极坐标,反之亦然,所以我决定编写一个小 Python 程序来帮助我进行转换。但是, Math.atan() 给我
我的公式f=arctan(ImZ/ReZ) 有两种选择: 选项 1 (atan): ImZ=-4.593172163003 ImR=-4.297336384845 >>> z=y/x >>> f1=m
atan 和 atan2 都是反正切函数,返回的都是弧度 对于两点形成的直线,两点分别是 point(x1,y1) 和 point(x2,y2),其斜率对应角度的计算方法可以是:
我有一个 2D 侧视射击游戏,我需要一些新的视角。我目前正在研究瞄准,并且它部分有效: Guzzle 速度已知,重力已知,并且到目标的 x,y 距离也已知。使用 SE 和维基百科上的各种来源,我提出了
我在java编程中使用半正矢公式(使用eclipse)。我的问题是在等式的末尾,我收到一个错误(atan 带下划线),指出“方法 atan(double) 对于 Math 类型未定义”。 我不知道出了
所以我想获得2点之间的度数,但是当我希望它返回180时,它返回0...0、90和270确实有效,但是当它180时它返回0..这是我的代码: Location loc1 = new Location(B
我是一名优秀的程序员,十分优秀!