浮動小数点を取る関数がありますが、計算結果をできるだけ正確に保ちたいと思います。私はあなたが2つの浮動小数点数を掛け合わせると、有効数字の倍数を倍増することを読んでいます。浮動小数点数を掛けて倍精度精度を維持する/取得する
したがって、浮動小数点数が2倍になると、たとえばfloat e, f;
となり、私はdouble g = e * f
となると、いつビットが切り捨てられますか?
私の例の機能では、キャスティングが必要ですか?はいの場合はどこですか?これはきつい内部ループにあります。もし各変数の周りにstatic_cast<double>(x)
を置くと、a b c d
が使われていますが、私は5-10%減速します。しかし、私は各変数を別々にキャストする必要はないと思っています。またはここでダブルを返すと、とにかく私に何の利得も与えていないと私だけでフロートを返すことができますか?
double func(float a, float b, float c, float d) {
return (a - b) * c + (a - c) * b;
}
他のオペランドがあなたのために変換されるので、1つのキャストのみが必要です_ "どちらかのオペランドが倍精度で、もう一方のオペランドが倍精度に変換される" _ source:http://en.cppreference.com/w/cpp/ language/operator_arithmetic#Conversionsしかし、これはあなたに同じ減速を与えるでしょう。ダブルを返すことに関する2番目の質問は、返された結果で何をするかによって異なります。 –
私の場合、両方の(すべての)オペランド(戻り値の型を除く)は浮動小数点ですか? – Ela782
どこでも 'double'を使用すると、パフォーマンスが向上します(とにかく精度が向上します)。これにより、変換のオーバーヘッドが節約されます。 – 5gon12eder