C、C ++、およびJavaでの浮動小数点演算と結合性
C、C ++、およびJavaでは、浮動小数点数を使用していくつかの数学演算を実行します。ここで、浮動小数点数が結合法則に従っているかどうかを確認します。
答えはいいえだ。浮動小数点数が結合法則に従わない場合があります。ここにいくつかの例があります。
サンプルコード
#include<iostream> using namespace std; main() { float x = -500000000; float y = 500000000; float z = 1; cout << "x + (y + z) is: " << x + (y + z) << endl; cout << "(x + y) + z is "<< (x + y) + z << endl; }
出力
x + (y + z) is: 0 (x + y) + z is 1
ここでは、結果が同じではないことがわかりますが、理論的には常に1になると言えます。ここで問題が発生します。これはどのように行われるのですか?
最初のケースでは、x +(y + z)、(500000000 + 1)が実行されています。ただし、フローティングポイントラウンドオフの場合は、再び500000000に変換されます。ここで、-500000000を加算すると、0になります。2番目の式では、値は(-500000000 + 500000000)=0であり、1を加算すると、最終結果は1になります。
整数を使用すると、両方の式が同じ結果、つまり1を返します。
-
Java8での中間操作と端末操作の違い
ストリームはJava8で導入され、ストーティング要素ではなくデータのグループを処理するためにのみ使用されます。実際のコレクションは変更されず、パイプライン化されたメソッドに従って結果を提供するだけです。 Stream apiは複数の操作をサポートし、操作は2つの部分に分かれています- 中間操作-これらの操作は、他のメソッドをパイプライン化し、他のストリームに変換するために使用されます。これらの操作は、ターミナル操作が実行されるまで呼び出されないため、結果は生成されません。以下に例を示します- sorted(Comparator ) ピーク(消費者) distinct() ターミナル操作
-
Pythonでの10進固定小数点および浮動小数点演算
浮動小数点数は、基数2の2進数としてメモリに表されます。その結果、浮動小数点の算術演算がおかしくなることがあります。 0.1と0.2を加算すると、次のような厄介な結果が生じる可能性があります- >>> 0.1 + 0.2 0.30000000000000004 実際、これはバイナリ浮動小数点表現の性質です。これは、どのプログラミング言語でも一般的です。 Pythonは、高速で正しく丸められた浮動小数点演算を実行するための10進モジュールを提供します。 10進モジュールは、浮動小数点を希望どおりに表現するように設計されており、算術演算の結果は期待どおりです。表現と操作の精度