std::numeric_limits<T>::is_exact ??

std::numeric_limits<T>::is_exact の言わんとしていることがサッパリ分からない…。 cppreference.com とかじゃ分からず、 ISO も読んでみたが情報量としては大して変わらない。

static constexpr bool is_exact;

19 True if the type uses an exact representation. All integer types are exact, but not all exact types are integer. For example, rational and fixed-exponent representations are exact but not integer.

20 Meaningful for all specializations.

"exact representation"、「正確な表現」というのが何を言わんとしているのか…。 とりあえず、この文章から分かることは

  • 組み込み型の整数型はすべて exact
  • exact な型すべてが整数とは限らない
    • 例えば有理数表現や指数部固定の表現*1は exact だが整数ではない

ということなんだが、結局 "exact representation" の定義はよく分からない。

ある型に対して「表現できる」と期待される値域において変換上の誤差が生じるか、みたいな話だろうか…。

表現する型 表現できると期待される値域 is_exact
整数型 整数型それぞれの値域 true
有理数 分母分子それぞれの値域 true
固定小数点型 内部表現の整数型の値域と固定指数によって決まる値域 true ?
浮動小数点型 false ?

「?」 のついてるところが私の理解の及ばない部分。 浮動小数点数は指数部と仮数部の兼ね合いで「実世界上での同じ値を表現できる複数の値」が存在すると言ってるんだろうか…。 でも、それも仮数部が必ずケチ表現だとなれば単一の表現にならないっけ…?? んーむ、わからん…。 知りたかったのは固定小数点型は exact か否か、だったのでとりあえず忘れてもいいんだけど、スッキリしないな…。

*1:いわゆる固定小数点のことだろう