目錄介紹
背景使用**
音訊處理器通常使用定點數字表示音訊訊號。在開發用於連線到音訊處理器的
gui的過程中,我需要一種簡單的方法來向使用者顯示定點編號。這個簡單的類是乙個定點數容器,它允許將值讀取或寫入為定點值或
double。
定點數歷史悠久,尤其是在浮點模組可用於
cpu之前。
dsp通常會使用固定數字格式,因為它們通常沒有浮點模組。 音訊
dsp以定點數字格式表示音訊訊號。
「1.31
」的音訊格式有乙個數字範圍或者
-1......
+1。在我的特定例子中,我需要使用數字範圍為
-8...+8的
「4.20
」格式。
「4.20
」格式將具有
1個符號位,
3個十進位制位和
20個小數字。
fixedpoint
類介紹如下:
/// /// a class to convert fixed point numbers from/to doubles.
///
public class fixedpoint
}/// /// is value negative
///
public bool isnegative
}/// /// get decimal part of fixed number
///
public int getdecimal
}/// /// get fraction part of fixed point number
///
public int getfraction
}private int _val;
/// /// get/set value with fixed point number
///
public int valueasfixedpoint
set
}/// /// get/set value with double
///
public double valueasdouble
set
}#endregion
/// /// instantiate a fixed point number
///
/// fixed point number format
public fixedpoint(string format)
);if (s.length != 2)
var b = int.tryparse(s[0], out _decwidth);
if (!b)
b = int.tryparse(s[1], out _fracwidth);
if (!b)
// calculate values to be used later
for (var i = 0; i < _fracwidth; ++i) _fracmask = (_fracmask << 1) + 1;
for (var i = 0; i < _decwidth - 1; ++i) _decmask = (_decmask << 1) + 1;
_signmask = 0x1 << (_decwidth + _fracwidth - 1);
for (var i = 0; i < (_fracwidth + _decwidth); ++i) _fullmask = (_fullmask << 1) + 1;
// calculate format range limits
_maxvalue = converttodouble(_signmask - 1);
_minvalue = -(_maxvalue + converttodouble(1));
}/// /// convert fixed point number to double
///
/// fixed point number
///
private double converttodouble(int val)
// do negative numbers
else
else}}
/// /// convert double to fixed point number
///
/// value to convert
///
private int converttofixedpoint(double x)
// and now for negative doubles
else
}/// /// converts positive doubles to fixed point number
///
/// double to convert to fixed point
/// fixed point
private int converttopositivefixedpoint(double x)
return ((int)dec << _fracwidth) + val;
}}
乙個簡單的測試程式如下所示:
首先,建立具有指定格式
「new fixedpoint("4.20")
」 的類的例項
將例項設定為測試值,在這種情況下為
「fp.valueasdouble = 5.1234;
」取回定點編號
「fptestval = fp.valueasfixedpoint;
」將其反饋回例項
「fp.valueasfixedpoint = fptestval;
」取回值為
double
「convertedval = fp.valueasdouble;
」測試值和返回值應該相同。
void main()
");
var fptestval = fp.valueasfixedpoint; // get the converted value
// and the bits and pieces of the fixed point number
var sign = fp.isnegative ? "-" : "+";
var dec = fp.getdecimal;
var frac = fp.getfraction;
var h = $"fixed point value = :: ";
console.writeline(h);
// now set 'fp' to test fixed point number
fp.valueasfixedpoint = fptestval;
// and convert it back to a double, should be the same as you started with
var convertedval = fp.valueasdouble;
console.writeline($"converted value = ");
}
控制台輸出如下:
test value = 5.123400
fixed point value = +:5:1f972 51f972
converted value = 5.123400
此類允許任何格式的定點數,只要總位數不超過32(
'int
' 的大小)即可。
到目前為止,我看到的常見格式是
1.15
、1.31
、4.20
、5.23
和9.23
,但是您可以建立和使用自己的格式。
定點數乘法
原碼乘法 原碼的手動乘法 就和小學學過的豎式乘法寫法一致,從右到左,乘數每一位分別與被乘數相乘。x 1101 原碼的一位乘法 具體計算 符號位最後單獨處理,絕對值參加乘法運算。該演算法因為每次根據乘出的一位來計算位積,所以稱為原碼一位乘法。步驟 初始部分積為0,yi為1 若yi為0,部分積加 x 累...
C 浮點數轉換為定點數
筆者最近在程式設計的時候,要控制浮點數的精度進行計算和對比,在網上經過一系列查詢後終於 在csdn上面找到了相關的內容,雖然控制浮點數的精度後沒有效能上的提公升,筆者知道了如何修改 和控制浮點數的精度了,總的來說,每天要進步一點點。如下 1 include cuda runtime.h 2 incl...
浮點數 定點數
浮點數是表示小數的一種方法.所謂浮點就是小數點的位置不固定,與此相反有定點數,即小數點的位置固定.整數可以看做是一種特殊的定點數,即小數點在末尾.8086 8088中沒有浮點數處理指令,不過從486起,cpu內建了浮點數處理器,可以執行浮點運算.一般的浮點數有點象科學計數法,包括符號位 指數部分和尾...