为什么有BLAS子程序ISAMAX为argmax ABS而不是argmax?
在使用std :: max_element和编译器优化标志的C++中,-O3我的速度与blas_isamax(16 ms vs 9 ms)相当,所以目前我的问题更多的是出于对速度的需求而不是出于兴趣.
我正在分析我的代码并优化我所能做的一切,直到一个看起来像这样的函数:
double func(double a, double b, double c, double d, int i){
if(i > 10 && a > b || i < 11 && a < b)
return abs(a-b)/c;
else
return d/c;
}
Run Code Online (Sandbox Code Playgroud)
在程序运行期间,它被称为数百万次,并且分析器向我显示,大约80%的时间都用于呼叫abs().
我替换abs()了fabs()它并且它提供了大约10%的加速,这对我来说没有多大意义,因为我多次听说它们对于浮点数是相同的并且abs()应该总是使用.这是不真实的还是我错过了什么?
什么是评估双重绝对值的最快方法,可以进一步提高绩效?
如果重要的话,我g++在Linux X86_64上使用.
Math.abs(x)(由Oracle实施)的常规实现由
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
Run Code Online (Sandbox Code Playgroud)
仅将数字符号的一位编码设置为零(或一位)是否更快?我想只有一个位编码数字的符号,并且它总是相同的位,但是我可能是错的。
还是我们的计算机通常不适合使用原子指令对单个位进行操作?
如果可以更快地实施,您能给出吗?
编辑:
已经向我指出Java代码是平台无关的,因此它不能依赖于单机的原子指令是什么。但是,为了优化代码,JVM热点优化器确实考虑了计算机的具体情况,并且可能会应用正在考虑的最优化方法。
但是,通过一个简单的测试,我发现至少在我的机器上,该Math.abs功能似乎并未针对单个原子指令进行优化。我的代码如下:
long before = System.currentTimeMillis();
int o = 0;
for (double i = 0; i<1000000000; i++)
if ((i-500)*(i-500)>((i-100)*2)*((i-100)*2)) // 4680 ms
o++;
System.out.println(o);
System.out.println("using multiplication: "+(System.currentTimeMillis()-before));
before = System.currentTimeMillis();
o = 0;
for (double i = 0; i<1000000000; i++)
if (Math.abs(i-500)>(Math.abs(i-100)*2)) // 4778 ms
o++;
System.out.println(o);
System.out.println("using Math.abs: "+(System.currentTimeMillis()-before));
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出:
234
using multiplication: 4985 …Run Code Online (Sandbox Code Playgroud) 有一个相关的问题,但我相信它没有回答这个问题。
查看std::abs和std::fabs文档,他们似乎具有完全相同的行为。作为个人注释,在我看来这std::fabs是可取的,因为它减轻了(见注释)中std::abs(int)定义的歧义。<cstdlib>
所以我的问题是:除了std::abs(int)潜在的歧义之外std::abs,std::fabs在应用于浮点值之间以及在应用于浮点值时是否有任何区别?
我试图创建一个整数列表,然后扫描它,以找到列表元素的减法的最小绝对值.我已经创建了列表,但是代码中存在找到最小绝对值的问题,因为它显示的结果不正确.我认为这可能是在循环期间列表元素的可能性.你能帮我找到吗?
例如,当我创建一个列表时? = [2, 7, 5, 9, 3, 1, 2],结果min应该是0,但它是1.
这是我的代码:
min=1000
for i in range (1, N-1):
for j in range (i+1, N):
if (abs (A [i-1] - A [j-1])<min):
min = abs (A [i-1] - A [j-1])
print ("%d" %min)
Run Code Online (Sandbox Code Playgroud) 我在 Python 中有以下脚本。我正在计算数组的傅立叶变换。当我想绘制结果(傅立叶变换)时,我使用的是该计算的绝对值。但是,我不知道复数的绝对值是如何产生的。有谁知道它是如何计算的?我需要这个在 Java 中重现。
import numpy as np
import matplotlib.pyplot as plt
from numpy import fft
inp = [1,2,3,4]
res = fft.fft(inp)
print(res[1]) # returns (-2+2j) complex number
print(np.abs(res[1])) # returns 2.8284271247461903
Run Code Online (Sandbox Code Playgroud) 在其中一个解决方案中,他/她发现AVX 向量的abs(inp)为,
__m256 符号位 = _mm256_set1_ps(-0.0f); __m256 inp_abs = _mm256_andnot_ps(sign_bit, inp);
其背后的逻辑是什么?
我不知道原始代码,但我不相信这是复杂的右移和abs.
以下是重命名的反编译IDA PRO代码的外观
char Ship; //Could be 0-7 (8 is reversed for special purpose)
char NewShip = 1; //Could be 0-7 (8 is reversed for special purpose)
short Frequency = 0; //This could be from 0 to 9999
bool NumberToFrequency = true;
Frequency = GetNextFrequencyToJoin(player->MyArena);
if ( NumberToFrequency )
{ //TODO: maybe the below is just Frequency % 7; ?
NewShip = (((unsigned long)Frequency >> 32) ^ abs(Frequency) & 7) - ((unsigned long)Frequency >> 32);
Ship = NewShip;
} else …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 stl sort 函数根据绝对值对给定数组进行排序,但它没有按指定顺序排序:我编写的代码:
int fun(int i,int j)
{
if(abs(i)<abs(j))
return j;
else
return i;
}
int main()
{
int arr[100000];
int i,n;
cin>>n;
for(i=0;i<n;i++)
cin>>arr[i];
sort(arr,arr+n,fun);
int diff=1000000ll;
int x=0;
int y,z;
for i 0 to n
cout<<arr[i];
return 0;
}
Run Code Online (Sandbox Code Playgroud) MathJava类中有没有返回两个整数的绝对差的方法?
int absDiff = 8 - 15;
int answer = 7;
Run Code Online (Sandbox Code Playgroud)