私のコンピューターが IEEE 754 浮動小数点エンコーディングを使用していると仮定すると、次の関数が false を返す最小の数値はいくつになるでしょうか。
constexpr bool test(const unsigned long long int x)
{
return static_cast<unsigned long long int>(static_cast<double>(x)) == x;
}
私のコンピューターが IEEE 754 浮動小数点エンコーディングを使用していると仮定すると、次の関数が false を返す最小の数値はいくつになるでしょうか。
constexpr bool test(const unsigned long long int x)
{
return static_cast<unsigned long long int>(static_cast<double>(x)) == x;
}
IEEE-754の a の仮数double
は 53 ビットです (52 ビットと 1 つが非表示で、非常に技術的です)。つまり、最上位ビットx
がビット 52 より上で、下位ビットの一部がゼロ以外の場合、比較は失敗します。
コードを書くことでこれを見つけることができます:
unsigned long long x = 0x1;
while(x > 0)
{
x <<= 1ULL;
if (!test(x+1))
{
cout << "x=" << hex << x << endl;
break;
}
}
編集:実際にテストした後、コードを少し修正しました。
x=20000000000000
予測どおりに印刷されます。
または、 を使用する場合は<limits>
、次の方法で同じ結果を得ることができます。
numeric_limits<double> n;
cout << "digits=" << dec << n.digits << " -> " << hex << (1ULL << n.digits) << endl;