0

B を A で除算する最も安全な方法は次のとおりです。

unsigned long long A;
unsigned long int B;

私はすでにそれを行うために次の行を使用しています。正常に動作しますが、セグメンテーション違反で失敗することがあります。

double C;
C= double(B)/double(A);

ありがとう

4

2 に答える 2

4

(まず、unsigned long intは と同じですunsigned long)

データ型昇格規則は、 を評価するときにA / BBが昇格されunsigned long long、除算が整数演算で実行されることを意味します。つまり、残りは失われます。

or Bいずれかの Aをキャストするdoubleと、演算が浮動小数点で実行されますdouble。(ただし、long long型を にキャストするとdouble、精度が失われる可能性があることに注意してください。)

セグメンテーション違反C = double(B) / double(A);にはなりませんのでご安心ください。このステートメントの前に、メモリ破損/その他の未定義の動作が発生している必要があります。スタックを台無しにしたと思われます。

于 2013-10-16T21:29:09.657 に答える
2

これらは int であるため、浮動小数点の小数の結果が実際に期待される場合を除き、double にキャストする必要はありません (つまり、おそらくキャストしたいのですが、それはあなたの過失とは関係ありません)。

ゼロ除算が原因でエラーが発生する可能性が高くなります。

于 2013-10-16T21:28:38.040 に答える