Является ли целое число float, разделенное на себя, гарантировано равным 1.f?

Если я пишу:

int x = /* any non-zero integer value */;
float y = x;
float z = y / y;

Является z гарантией точности 1.f?

Ответ 1

Если ваша реализация на С++ использует IEEE754, тогда да, это гарантировано. (Оператор деления должен возвращать наилучшее возможное значение с плавающей запятой).

Единственными исключениями для y / y, в общем случае, не являющимися 1f являются случаи, когда y - это NaN, +Inf, -Inf, 0f и -0f, или если вы находитесь на платформе, где int настолько широк, что некоторые его экземпляры не могут быть представлены в float, если float не установлен на +Inf или -Inf 1. Исключая эту конечную точку, в вашем случае это означает, что int x = 0; приведет к единственному исключению.

IEEE754 чрезвычайно распространен. Но, чтобы точно проверить, проверьте значение

std::numeric_limits<float>::is_iec559;

1 Платформа, например, с 128-разрядным int и 32-битным IEEE754 float будет демонстрировать это поведение для определенных значений x.

Ответ 2

Нет, не во всех случаях, даже для IEEE754.

Например, при int x = 0; вы получите NaN. (Live)