質問

1) これはオーバーフローしませんか?

long long v1, v2, result;
[..]
result = ((long double) v1 / v2) * 1000000LL;

1.a) 定数の LL を省略できますか?なぜ。

2) あるいは、このバリエーションは float なしでも問題ありませんか?

long long l1, l2, result;
[..]
result = (1000000 * (v1 / v2) + v1 % v2);

2.a) オーバーヘッドが大きいのはどれですか?1番目またはこの例?

3) float がオーバーフローしたり、「正常な」値にラップしたりすることはありますか?

役に立ちましたか?

解決

はい、例えば、(1)につながる可能性が簡単にあふれ、それはintに収まるように十分に小さいが(最も下にあるので、= 1000000000000000 v1とv2 = 1.あなたはその定数のLLを必要としない、と言う、場合いずれの場合において実装)。

(2)私はそれらを与えているようにV1とV2である場合には、実施例1と全く同様にオーバーフローすることができます。

最初の例では、浮動小数点演算などのより高価なことは、整数演算よりも高価である。

(3)フロートは確かオーバーフロー及び結果は実装依存していてもよい。

としてArjitは、あなたが計算を実行する前に、V1の値をチェックすることにより、オーバーフローを防ぐことができ、指摘しています。 v1はできれば負のあなたも、負のバージョンを確認する必要があり、そしておそらく以下が良いかもしれない...

if ((LONG_LONG_MAX / 1000000) > V1)
{
...
}
あなたは本当に最高限度に反対している場合は、

あなたはunsignedする変数を宣言することによって、自分自身にもう少しヘッドルームを与えることができる。

後 - 正しい間違いの編集Arjitによって指摘

他のヒント

まず最初に

  1. INT または Long 計算を行う場合は、float を使用しないでください。最初の部分の結果には、ほぼ等しい多くの異なる値が含まれるためです。

(float)v1/v2 = ab.cdef であるためです。// ここで、cdef は変化する可能性があります。

V1 = 2^15およびV2 = 1の場合、2番目の実装はオーバーフローを引き起こす可能性があります

したがって、オーバーフローとセキュリティを探している場合は、常にチェックする必要があります

2^18/Constant のように、この場合は 1000000

それで

if(2^18/Constant > v1)

    result = (1000000 * (v1 / v2) + v1 % v2);

これはハッキングの証拠になります。

お役に立てれば

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top