簡體   English   中英

浮點數的按位乘法

[英]Bitwise multiplication of a floating point number

我正在為學校設計一個項目,該項目要求我僅使用浮點數的二進制表示來操縱浮點數,特別是將浮點數乘以2。 我應該僅使用位運算(!| ^&〜),邏輯運算符(&&,||)和if / while表達式來復制以下代碼的功能。

但是,我有一些數字不正確的問題。 例如,當我傳入8388608(0x800000)時,輸出為8388608,而為16777216(0x1000000)。

這是我們應該復制其功能的代碼:

unsigned test_dl23(unsigned uf) {
float f = u2f(uf);
float tf = 2*f;
if (isnan(f))
  return uf;
else
  return f2u(tf);
}

這是我的嘗試:

unsigned dl23(unsigned uf) {

int pullExpMask, expMask, mantMask, i, mask, signedBit
mask = 0x007fffff;

pullExpMask = (-1 << 23) ^ 0x80000000; // fills lower 23 bits with zeroes
signedBit = 0x80000000 & uf;
expMask = (uf & pullExpMask); // grabs the exponent and signed bits, mantissa bits are zeroes
mantMask = mask & uf;

if (!(uf & mask)){ // if uf has an exponent that is all ones, return uf
    return uf;
}

else if (expMask == 0){
   mantMask =  mantMask << 1;

} 
else if (expMask != 0){
  expMask = expMask + 0x00100000;
}

return (signedBit | expMask | mantMask);


}

我已經在這個問題上研究了很長時間了,任何有用的提示將不勝感激!

我不確定您指的是什么數字失敗,但是我確實在您的代碼中看到了一個會導致這種現象的錯誤。 // if uf has an exponent that is all ones, return uf帶有注釋的部分// if uf has an exponent that is all ones, return uf不會執行此操作。 它將測試尾數部分是否為0並返回未更改的數字,從而導致您看到的行為。 它可能應該類似於if (expMask == pullExpMask) {

此外,您還需要考慮指數增量使其全部為1的情況。它應始終為inf,並且永遠不要安靜或發信號通知NaN。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM