1

以下のコードを書いていますが、問題があります。1 を 1059255 で除算すると、除算の結果がゼロに近くなり、丸められるため、結果はゼロになります。

for(x = 2 ; x <= 1059255; x++)
{
    y += (1/1059255) * x;
}

正しい結果を得るために必要な変更は何ですか?

4

9 に答える 9

6

これが整数除算です。x が y より小さい場合に x/y を除算すると、結果は常に 0 になります。これらの数値のいずれかを float にキャストします。

以下にいくつかの可能性を示します。

y += (1.0f/1059255) * x; // float literal divide by integer, this will work

また

y += (static_cast<float>(1)/1059255) * x; // casting integer literal to float, this works too

明らかに、分母を float にすることもできます。これはすべて、double でも行うことができます。

于 2013-07-16T14:23:38.713 に答える
2

これは整数除算だからです。オペランドを float または double にします。

y +=  (1.0/1059255)*x;
于 2013-07-16T14:24:18.973 に答える
1

C++ では、2 つの整数の除算は整数になります。この場合、2 つの整数を除算しているため、結果は常に に切り捨てられ0ます。

.0あなたの質問からは確かなことはわかりませんが、リテラルに接尾辞を追加することで強制できる浮動小数点除算が必要だったのでしょう。また、除算と乗算を単一の除算に変更する理由もわかりません。

for(x = 2 ; x <= 1059255; x++)
{
    y += x / 1059255.0;
}

しかし、これが実際のコードである場合は、結果を常に一定時間で計算できるため、ループを実行する理由はまったくありません (内側のループ項がループ インデックス値に比例してスケーリングされるため)。

于 2013-07-16T14:36:21.767 に答える
1

整数除算1/1059255なので0

に変更する1.0/1059255と、期待どおりの結果が得られます。

1.0タイプ 、タイプdouble1.0fあることに注意してくださいfloat。適切なものを選択してください。

于 2013-07-16T14:25:09.167 に答える
1

整数以外の数値を表すことができる型を使用する必要があります。浮動小数点型と固定小数点型のどちらが必要かは、精度がどれほど重要かによって異なります。ただし、浮動小数点数を使用するのは非常に簡単です。

double x, y = 0;
for(x = 2 ; x <= 1059255; x++)
{
    y +=  (1.0/1059255.0)*x;
}

エラーの量が許容できない場合は、固定小数点数を調べてください。

于 2013-07-16T14:26:59.440 に答える
0

float や double などの浮動小数点数型を使用します。

于 2013-07-16T14:24:20.900 に答える