Вы должны выполнить сравнение со знаком, если не уверены, что все исходные значения были положительными. Вы должны использовать целочисленный тип того же размера, что и исходный тип с плавающей запятой. Каждый чип может иметь свой внутренний формат, поэтому сравнение значений из разных чипов с целыми числами, скорее всего, даст неверные результаты.
Большинство форматов с плавающей точкой выглядят примерно так: sxxxmmmm
s
является знаковым битом
xxx
- это показатель степени
mmmm
это мантисса
Тогда представленное значение будет примерно таким: 1mmm << (xxx-k)
1mmm
, поскольку имеется подразумеваемый ведущий бит 1
, если значение не равно нулю.
Если xxx < k
, то это будет сдвиг вправо. k
близко, но не равно половине наибольшего значения, которое может быть выражено xxx
. Настраивается на размер мантиссы.
Все это говорит о том, что без учета NaN
сравнение значений с плавающей запятой как целых чисел со знаком одинакового размера даст значимые результаты. Они разработаны таким образом, чтобы сравнения с плавающей запятой были не более дорогостоящими, чем целочисленные сравнения. Существуют оптимизации компилятора, чтобы отключить NaN
проверки, чтобы сравнения представляли собой прямые целочисленные сравнения, если формат чипа с плавающей запятой это поддерживает.
Как целое число, NaN
больше бесконечности, больше конечных значений. Если вы попытаетесь сравнить без знака, все отрицательные значения будут больше положительных значений, так же как целые числа со знаком, приведенные к беззнаковому.