4

以下の式をC ++で使用しようとしていました。私は両方の変数を整数として宣言しており、それらが切り上げられることを期待していますが、切り捨てられているようです。私はこれを見てきましたが、何が間違っているのかを見つけることができないようです。どんな助けでも大歓迎です。

int user_degrees_latitude, user_degrees_longitude;
const int lat_const=(-90)
const int long_const=(-180)

sector_latitude = (user_degrees_latitude - lat_const) / (10);
sector_longitude = (user_degrees_longitude - long_const) / (10);

答えは、sector_latitude の場合は 13、sector_longitude の場合は 11 になるはずですが、コンピューターはそれぞれを 12 と 10 に切り捨てます。

4

3 に答える 3

0

このスレッドは非常に古いものですが、既存の両方の回答が浮動小数点に変換されてから整数に戻っているのを見るのは悲しいことです。すべて整数のみの算術演算を使用して、商を最も近い整数で割っnd四捨五入する場合は、d/2除算の前に次の値を足すだけです。

q = (n + d/2) / d

(もちろん、d/2と書くこともできますd>>1が、コンパイラがそれを行います。) したがって、nが 19 でdが 4 の場合、正確な商は 4.75 にn/dなり、4 (ゼロに向かって切り捨て) になりますが、上記の式は 5 になります。 、これは望ましい結果です。OP に示されている例では、最後の 2 行を次のように更新するだけです。

sector_latitude = (user_degrees_latitude - lat_const + 5) / (10);
sector_longitude = (user_degrees_longitude - long_const + 5) / (10);

編集: 指摘されました (@kees-jan に感謝)、nifndが異なる符号を持っている場合、この解決策は機能しないため、負の商が得られます。以下は、高価な int-float-int 変換を回避する、より完全なソリューションです。

constexpr int div_round(int n, int d)
{
    int offset = (((n < 0) == (d < 0)) ? d : -d) / 2;
    return (n + offset) / d;
}

sector_latitude = div_round(user_degrees_latitude - lat_const, 10);
sector_longitude = div_round(user_degrees_longitude - long_const, 10);
于 2022-01-30T23:05:09.437 に答える