浮動小数点型(float / double / long double)の任意の値'v'の場合、C89は、floor(v)とceil(v)の数学的に正確な整数結果が'vの型の表現可能な値であることを保証しますか? '?
後のCまたはC++標準のいずれかがこれを保証しますか?
IEEE 754はこれを保証しますか?
浮動小数点型(float / double / long double)の任意の値'v'の場合、C89は、floor(v)とceil(v)の数学的に正確な整数結果が'vの型の表現可能な値であることを保証しますか? '?
後のCまたはC++標準のいずれかがこれを保証しますか?
IEEE 754はこれを保証しますか?
これは、IEEE-754 番号の構成によって保証されます。(明確にするために: C は IEEE-754 を保証しませんが、次の分析は、私がよく知っている他のすべての浮動小数点形式にも当てはまります。重要な特性は、形式内の十分に大きな数値はすべて整数であるということです)。
通常の IEEE-754 数値の形式は であることを思い出してください。仮数±1.xxx...xxx * 2^n
フィールド (xxx...xxx
部分) の幅は、数値のタイプ (単精度の場合は 23 桁、倍精度の場合は 52 桁) によって定義されます。n
許容範囲内の指数 ( ) を持つそのような数値はすべて表現可能です。
WLOGv
が正であると仮定します (v
負の場合は、次の分析でceil
とを入れ替えることができます)。floor
有効ビットをv
持ち、2 進固定小数点数として書き出します。次の 3 つの可能性があります。k
v
ケース 1: すべての仮数ビットが整数です。書き出すv
とこんな感じ
xxxxxxxxxxxxxxxxxxxxxxxx000000...00000.0
thenv
は整数であり、そうceil(v) = floor(v) = v
であり、両方とも自明に表現できます。
ケース 2: すべての仮数ビットが小数です。を書き出すとv
、次のようになります。
0.000000...00000xxxxxxxxxxxxxxxxxxxxxxxx
thenv
は範囲 [0,1) にあり、 sofloor(v) = 0
は表現可能でありceil(v)
、0 または 1 のいずれかであり、どちらも表現可能です。
ケース 3:v
整数仮数ビットと小数仮数ビットの両方が含まれています。
xxxxxxxxxxxxxx.xxxxxxxxxx
次に、次floor(v)
のとおりです。
xxxxxxxxxxxxxx.
少なくとも 1 つの小数ビットを破棄floor(v)
し、最大でもk-1
有効ビットがあり、指数が と同じv
であるため、表現可能です。
v
が整数の場合ceil(v) = floor(v) = v
、ceil(v)
は表現可能です。それ以外の場合、ceil(v) = floor(v) + 1
なども最大でk-1
有効ビットがあり、表現可能でもあります。