以下のコードを書いていますが、問題があります。1 を 1059255 で除算すると、除算の結果がゼロに近くなり、丸められるため、結果はゼロになります。
for(x = 2 ; x <= 1059255; x++)
{
y += (1/1059255) * x;
}
正しい結果を得るために必要な変更は何ですか?
以下のコードを書いていますが、問題があります。1 を 1059255 で除算すると、除算の結果がゼロに近くなり、丸められるため、結果はゼロになります。
for(x = 2 ; x <= 1059255; x++)
{
y += (1/1059255) * x;
}
正しい結果を得るために必要な変更は何ですか?
これが整数除算です。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 でも行うことができます。
これは整数除算だからです。オペランドを float または double にします。
y += (1.0/1059255)*x;
C++ では、2 つの整数の除算は整数になります。この場合、2 つの整数を除算しているため、結果は常に に切り捨てられ0
ます。
.0
あなたの質問からは確かなことはわかりませんが、リテラルに接尾辞を追加することで強制できる浮動小数点除算が必要だったのでしょう。また、除算と乗算を単一の除算に変更する理由もわかりません。
for(x = 2 ; x <= 1059255; x++)
{
y += x / 1059255.0;
}
しかし、これが実際のコードである場合は、結果を常に一定時間で計算できるため、ループを実行する理由はまったくありません (内側のループ項がループ インデックス値に比例してスケーリングされるため)。
整数除算1/1059255
なので0
に変更する1.0/1059255
と、期待どおりの結果が得られます。
1.0
タイプ 、タイプdouble
で1.0f
あることに注意してくださいfloat
。適切なものを選択してください。
整数以外の数値を表すことができる型を使用する必要があります。浮動小数点型と固定小数点型のどちらが必要かは、精度がどれほど重要かによって異なります。ただし、浮動小数点数を使用するのは非常に簡単です。
double x, y = 0;
for(x = 2 ; x <= 1059255; x++)
{
y += (1.0/1059255.0)*x;
}
エラーの量が許容できない場合は、固定小数点数を調べてください。
float や double などの浮動小数点数型を使用します。