12

doubleに「正確な」整数値がある場合、次のようになります。

double x = 1.0;
double y = 123123;
double z = -4.000000;

(int)x、(int)y、(int)zを介して整数型にキャストすると、1、123123、および-4に正しく丸められることが保証されていますか?(そして、浮動小数点の奇妙さの0、123122、または-5 b / cに切り捨てないでください)。私はこのページ(デフォルトでは数値型としてdoubleのみを持つ言語であるluaのfpについて)に従ってb / cに質問し、IEEE 754に従ってdoubleを使用した整数演算がどのように正確であるかについて話しますが、私はそうではありません整数型のパラメーターを使用してC関数を呼び出すときに、doubleを手動で丸めることを心配する必要がある場合、またはdoubleが正確な整数値を持つ場合はそれが処理されることを確認してください。

4

4 に答える 4

9

はい、整数値がに収まる場合int

Adoubleは、タイプの範囲外の整数値を表す可能性がありますint。たとえば、タイプに16ビットしかない場合123123.0は、に変換できません。intint

doubleまた、特定のタイプが表すことができるすべての値をaが表すことができるという保証もありません。IEEE 754は、仮数に52ビットまたは53ビットのようなものを使用します。が64ビットの場合long、非常に大きいビットとその逆を変換しlongdoubleも同じ値が得られない可能性があります。

于 2012-06-07T22:40:08.003 に答える
4

Daniel Fischerが述べたように、doubleの整数部分(この場合はdoubleは正確に)の値が変換先の型で表現可能である場合、結果は正確です。値が宛先タイプの範囲外である場合、動作は定義されていません。「未定義」とは、標準が任意の動作を許可することを意味します。最も近い表現可能な数値を取得する、ゼロを取得する、例外を取得する、またはコンピューターが爆発する可能性があります。(注:C標準では、コンピューターが爆発したり、宇宙を破壊したりすることも許可されていますが、製造元の仕様により、動作に厳しい制限が課されている可能性があります。)

于 2012-06-07T23:41:43.577 に答える
1

それが本当に真の整数である場合、それは正しく実行されます。これは、状況によっては保証される場合があります。しかし、値が以前の浮動小数点計算の結果である場合、それを簡単に知ることはできません。

のように、 floor()関数を使用して値を明示的に計算してみませんかlong value = floor(x + 0.5)。または、さらに良いことに、modf()関数を使用して整数値を検査します。

于 2012-06-07T20:54:13.720 に答える
0

はい、コードで入力したため、指定した正確な値が保持されます。たとえば、計算では0.999999999999が得られることがありますが、これは、保存容量ではなく、doubleを使用して計算する際のエラーが原因です。

于 2012-06-07T20:48:44.900 に答える