2つの数字の間の符号の変化を検出する方法についていくつかの実験を行っていました。 x
、y
という2つの数字が与えられているとします。例えば、double
は、それらが異なる符号を持っているかどうかを知りたいとします。私はいつも、私は一般的にsignbitによって検出されたサインの変化とゼロとの比較と比較
x*y > 0
を見てきたものを真似している。しかし、これは正確に一つが通常どうなるのかのようではない読み込みます。 2つの数値を掛け合わせて読み込み、結果の符号をチェックします。しかし、私たちが本当にやることは、それぞれの数字のサインをチェックし、通常のルールでサインの変更を決定することです。これは似ている
signbit(x)^signbit(y)
数字を掛けなければならないかどうかは、パフォーマンスに何らかの影響があるかどうかが分かりました。私は悪影響を期待していた。
パフォーマンスを比較すると、前者が高速に計算されます。
なぜか分かりません。コンパイラは、x*y > 0
をsignbit(x)^signbit(y)
という意味意味で置き換えることができます。つまり、符号ビットのxorはx
とy
です。説明は何ですか?
注:signbit(x)^signbit(y)
はx*y
が、全体x*y > 0
に代わるものではありません。使用
コード:(Visual Studioで作成)
#include <iostream>
#include <math.h>
#include <string>
#include <chrono>
using namespace std;
using namespace std::chrono;
#define N 1000000
int main() {
double x, y;
cout << "x = ";
cin >> x;
cout << "y = ";
cin >> y;
bool answer;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
for (auto i = 0; i < N; ++i) {
answer = signbit(x)^signbit(y);
}
high_resolution_clock::time_point t2 = high_resolution_clock::now();
auto diffBit = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
high_resolution_clock::time_point t3 = high_resolution_clock::now();
for (auto i = 0; i < N; ++i) {
answer = (x*y > 0);
}
high_resolution_clock::time_point t4 = high_resolution_clock::now();
auto diffMult = std::chrono::duration_cast<std::chrono::nanoseconds>(t4 - t3).count();
cout << "Bit function lasted = " << diffBit << endl;
cout << "Multiplication lasted = " << diffMult << endl;
}
'x * y> 0'は' signbit(x)^ signbit(y)> 0'と等しくないので、例えば 'x = 1'と' y = 1'をとります。 – Dani
@Dani私は、signbitsのxorをゼロと比較していません。 signbitsのxorはすでに符号の変化を計算します。 – myfirsttime1
テストコード、コンパイラとバージョン、コマンドラインが使用されていますか? –