Рассмотримточно создать значение с плавающей запятой в диапазоне [а, Ь)
auto x = a + (b-a)*v;
, который предназначен для создания значения в диапазоне [a,b)
фактором v
в [0,1.0)
. С чисто математической точки зрения, x>=a
и x<b
. Но как мы можем доказать или убедиться, что это верно для с плавающей запятой? a
, b
, v
неотрицательные и конечные значения с плавающей точкой одного и того же типа (double
или float
) и b>a
(первоначально сказал b>=a
что, очевидно, несовместимо с моими требованиями к x
) и v<=netxtafter(1.0,0)
(то есть, это просто ниже 1.0).
Это кажется очевидным, что b-a >0
, и поэтому (b-a)*v >=0
, так что нам не нужно, чтобы проверить:
if (x<a) return a;
Но это также излишним?
if (x>=b) return std::nextafter(b,a);
Может ли компилятор (оптимизация) переписать выражения, чтобы повлиять на эти вопросы? Введите тип представления с плавающей запятой? (Я в основном заинтересованы в наиболее распространенных (iec559/IEEE 754).
Я не понимаю беспокойства. Если ваше равенство имеет место для любого (положительного) Реального, оно также выполняется для любых чисел с плавающей запятой, так как Q (рациональные) является подмножеством R (реалов) и чисел с плавающей запятой являются подмножество Q ... –
Я думаю, худшее, что может произойти, это когда ваши цифры, например, либо v, b или a (или все из них) чрезвычайно малы или близки к границам, и в этом случае усечение может быть проблемой .. однако усечение всегда в сторону более низкого значения, и все ваши цифры положительны ... –
@CedricDruck , Положите это так: если нет никакого беспокойства, это должно быть легко доказать. Позаботьтесь, чтобы написать ответ? –