[英]Comparing floats in their bit representations
假設我想要一個帶有兩個浮點數( x
和y
)的函數,我想比較它們不使用它們的float
表示,而是將它們按位表示為32位unsigned int
。 也就是說,像-495.5
這樣的-495.5
具有位表示0b11000011111001011100000000000000
或0xC3E5C000
作為float
,並且我有一個具有相同位表示的unsigned int
(對應於十進制值3286614016
,我不關心)。 有沒有簡單的方法讓我只使用各自的unsigned int
對應物中包含的信息對這些浮點數執行<=
這樣的操作?
您必須進行簽名比較,除非您確保所有原始值都是正數。 必須使用與原始浮點類型大小相同的整數類型。 每個芯片可能具有不同的內部格式,因此將來自不同芯片的值作為整數進行比較最有可能產生誤導性結果。
大多數浮動格式看起來像這樣: sxxxmmmm
s
是一個標志位
xxx
是指數
mmmm
是尾數
表示的值將是: 1mmm << (xxx-k)
1mmm
因為除非值為零,否則隱含前導1
位。
如果xxx < k
那么它將是右移。 k
接近但不等於xxx
可以表示的最大值的一半。 它根據尾數的大小進行調整。
可以這么說,無視NaN
,將浮點值比較為相同大小的有符號整數將產生有意義的結果。 它們的設計方式使得浮點比較不會比整數比較更昂貴。 有編譯器優化來關閉NaN
檢查,以便比較是直接整數比較,如果芯片的浮點格式支持它。
作為整數, NaN
大於無窮大大於有限值。 如果您嘗試無符號比較,則所有負值都將大於正值,就像轉換為無符號的有符號整數一樣。
總之,沒有。 IEEE 754可能允許這樣的某些類型的黑客,但它們不能一直工作並處理所有情況,並且一些平台不使用該浮點標准(例如x87內部具有80位精度的雙打)。
如果你出於性能原因這樣做,我建議你強烈重新考慮 - 如果使用整數比較更快,編譯器可能會為你做,如果不是,你需要多次支付浮點數到int轉換,當可以在不將寄存器移出寄存器的情況下進行簡單比較時。
如果你真的真的不關心轉換收益率,那就不難了。 但結果是非常不便攜的,你幾乎肯定不會得到一個完全類似你通過直接比較浮點數得到的順序。
typedef unsigned int TypeWithSameSizeAsFloat; //Fix this for your platform
bool compare1(float one, float two)
union Convert {
float f;
TypeWithSameSizeAsFloat i;
}
Convert lhs, rhs;
lhs.f = one;
rhs.f = two;
return lhs.i < rhs.i;
}
bool compare2(float one, float two) {
return reinterpret_cast<TypeWithSameSizeAsFloat&>(one)
< reinterpret_cast<TypeWithSameSizeAsFloat&>(two);
}
只需了解警告,並仔細選擇第二種類型。 無論如何,它幾乎毫無價值。
也許我誤解了這個問題,但我想你可以這樣做:
bool compare(float a, float b)
{
return *((unsigned int*)&a) < *((unsigned int*)&b);
}
但這假定了各種各樣的事情,並且還保證了為什么你想要比較兩個浮點數的按位表示的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.