9

次のようなものがある場合:

long x = 1/2;

これは1に切り上げるべきではありませんか?画面に印刷すると、0と表示されます。

4

6 に答える 6

30

小数点以下のすべてを切り捨てる整数除算を行っています。

于 2010-02-02T20:34:50.467 に答える
6

整数除算は、数論にそのルーツがあります。1/2を行うとき、2は1に何回等しいかを尋ねていますか?答えは決してないので、方程式は0 * 2 + 1 = 1になります。ここで、0は商(1/2から得られるもの)であり、1は剰余(1%2から得られるもの)です。

%は数学的な意味では真のモジュラスではなく、常に除算の余りであることを指摘するのは正しいことです。負の整数を扱う場合は違いがあります。

お役に立てば幸いです。

于 2010-02-02T21:26:54.933 に答える
5

この式が行っていることは、最初に x という long の存在を宣言し、次に右側の式の値を代入することです。右辺の式は 1/2 で、1 と 2 はどちらも整数なので、これは整数除算と解釈されます。整数除算では、結果は常に整数になるため、5/3 の行に沿ったものは 1 を返します。では、1/2 の場合、2 は 1 にいくつ収まりますか? 0.

double x = 1/2 のように記述した場合、言語によっては興味深い出力が得られることがあります。この場合は 0.5 を期待するかもしれませんが、多くの場合、最初に右側の整数値を評価してから、結果を割り当てて double に変換し、値 0.0 を与えます。

この種の型変換を行う場合、結果が決して丸められないことに注意することが重要です。したがって、逆の場合: long x = (long)(1.0/2.0); (1.0/2.0) は 0.5 に評価されますが、(long) キャストはこれを強制的に 0 に切り捨てます。長い x = (long)(0.9) があったとしても、結果は 0 のままです。単純に切り捨てられます。小数点以下。

于 2010-02-02T21:16:26.620 に答える
4

決して丸める状態ではないので丸められません

long に代入する前に、式「1/2」が 0.5 になることはありません

これは、long x = 1.0/2.0割り当ての前の右側の式が丸めに有効であるためです。0.499999999999997 を取得しない限り...

于 2010-02-02T20:36:06.717 に答える
2

この質問はこのサイトで以前に回答されました。0.5 を使用したい場合は、整数除算を行っています。

double x = (double)1/2;

の値が得られます0.5

于 2013-12-27T23:58:48.973 に答える
1

さまざまな丸め規則が多数ありますが、最も一般的なのは +inf 方向への丸め、-inf 方向への丸め、ゼロ方向への丸めです。多くの人は、正しい方法が 1 つあると思い込んでいますが、その 1 つの方法がどうあるべきかについては、全員が異なる考えを持っています ;-)

整数除算の中間の非整数結果はありませんが、もちろん、除算は決定論的に行われ、特定のプラットフォームとコンパイラでは常に 1 つの特定の丸め規則に従います。

Visual C++ では、5/2 = 2 および -5/2 = -2 となり、ゼロに丸められます。

C、C++、および Java での丸めは、一般に「切り捨て」と呼ばれます。つまり、不要なビットを削除するという意味です。しかし、これは誤解を招く可能性があります。4ビットの2の補数バイナリを使用して、切り捨てが意味することを行うと...

 5/2 = 0101/0010 = 0010.1 --> 0010 =  2
-5/2 = 1011/0010 = 1101.1 --> 1101 = -3

これは、Python が行うこと (または少なくとも Python 2.5 で行ったこと) である -infinity に向かって丸められます。

符号と大きさの表現を使用する場合、切り捨ては適切な言葉ですが、2 の補数は何十年もの間、事実上の標準でした。

C および C++ では、通常は切り捨てと呼ばれますが、実際には、この詳細は標準では定義されておらず、実装に任されています。これは、コンパイラがプラットフォームで最も単純で最速の方法を使用できるようにするための言い訳です (プロセッサ除算命令は何ですか)。当然です)。ただし、負の数がある場合にのみ問題になります.5/2 = 3を与える言語や実装はまだ見たことがありません.

Java標準が何を言っているのかわかりません。Python のマニュアルでは、"floor" 除算を指定しています。これは、-infinity への丸めの一般的な用語です。

編集

追加の注意 - 定義により、a/b = c 剰余 d の場合、a = (b*c)+d です。これを保持するには、丸め規則に合わせて余りを選択する必要があります。

剰余とモジュロは同じであると想定する傾向がありますが、WRT 符号付きの値は、丸め規則によって異なる場合があります。モジュロ値は、定義上負になることはありませんが、剰余は負になる可能性があります。

Python の負の無限大への丸めルールは、単一の % 演算子が剰余としてもモジュロとしても有効であることを保証することを意図していると思われます。C および C++ では、% が意味するもの (剰余または剰余) は (ご想像のとおり) 実装で定義されています。

Ada には実際には mod と rem という 2 つの別個の演算子があります。mod と rem で異なる結果得られるように、除算をゼロに丸める必要があります。

于 2010-02-02T21:36:25.067 に答える