Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

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を返します。


  1. Java8での中間操作と端末操作の違い

    ストリームはJava8で導入され、ストーティング要素ではなくデータのグループを処理するためにのみ使用されます。実際のコレクションは変更されず、パイプライン化されたメソッドに従って結果を提供するだけです。 Stream apiは複数の操作をサポートし、操作は2つの部分に分かれています- 中間操作-これらの操作は、他のメソッドをパイプライン化し、他のストリームに変換するために使用されます。これらの操作は、ターミナル操作が実行されるまで呼び出されないため、結果は生成されません。以下に例を示します- sorted(Comparator ) ピーク(消費者) distinct() ターミナル操作

  2. Pythonでの10進固定小数点および浮動小数点演算

    浮動小数点数は、基数2の2進数としてメモリに表されます。その結果、浮動小数点の算術演算がおかしくなることがあります。 0.1と0.2を加算すると、次のような厄介な結果が生じる可能性があります- >>> 0.1 + 0.2 0.30000000000000004 実際、これはバイナリ浮動小数点表現の性質です。これは、どのプログラミング言語でも一般的です。 Pythonは、高速で正しく丸められた浮動小数点演算を実行するための10進モジュールを提供します。 10進モジュールは、浮動小数点を希望どおりに表現するように設計されており、算術演算の結果は期待どおりです。表現と操作の精度