1. ホーム
  2. c++

[解決済み] 1.0に最も近い、1.0ではないダブルは何ですか?

2023-02-21 19:20:03

質問

1.0に最も近いが、実際には1.0ではない2倍をプログラムで取得する方法はありますか?

これを行う 1 つの厄介な方法は、double を同じサイズの整数に memcpy して、1 を引くことです。 IEEE754 浮動小数点フォーマットが動作する方法、これは指数を 1 つ減らしながら、小数部分をすべてのゼロ (1.000000000000) からすべての 1 (1.1111111111) に変更することになります。 しかし、整数がリトルエンディアンで格納され、浮動小数点がビッグエンディアンで格納されるマシンが存在するため、これは常に機能するわけではありません。

どのように解決するのですか?

C++11 からは nextafter を使って、指定された方向で次の表現可能な値を得ることができます。

std::nextafter(1., 0.); // 0.99999999999999989
std::nextafter(1., 2.); // 1.0000000000000002

デモ