定點數轉換器

2021-10-23 06:02:12 字數 3926 閱讀 6561

目錄介紹

背景使用**

音訊處理器通常使用定點數字表示音訊訊號。在開發用於連線到音訊處理器的

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內建了浮點數處理器,可以執行浮點運算.一般的浮點數有點象科學計數法,包括符號位 指數部分和尾...