标签: fixed-point

理解定点算术

我正在努力解决如何在不同精度的定点数上实现算术.我读过R. Yates的论文,但我还是输了.在下文中,我使用Yates的符号,其中A(n,m)指定带有n整数位,m小数位和n + m + 1位的整数的带符号定点格式.

简短的问题:究竟是怎样一个A(a,b)*A(c,d)A(a,b)+A(c,d)进行时a!=cb=! d

长问题:在我的FFT算法中,我生成一个随机信号,其值在-10V和10V之间,有符号输入(in),它被缩放到A(15,16),并且旋转因子(tw)被缩放到A(2,29).两者都存储为ints.像这样的东西:

float temp = (((float)rand() / (float)(RAND_MAX)) * (MAX_SIG - MIN_SIG)) + MIN_SIG;
int in_seq[i][j] = (int)(roundf(temp *(1 << numFracBits))); 
Run Code Online (Sandbox Code Playgroud)

同样适用于旋转因素.

现在我需要表演

  1. res = a*tw
    问题:
    a)我该如何实现?
    b)大小应该res是64位吗?
    c)我可以制作'res'A(17,14)因为我知道范围atw?如果是的话,我应该a*tw按2 ^ 14缩放以存储正确的值 …

c fixed-point

6
推荐指数
1
解决办法
636
查看次数

计算1到2之间的数字的对数基数2的有效方法

我正在开发一个定点平台(不支持浮点运算).

我将任何有理数表示qq * (1 << precision).

我需要用于计算对数底2的有效方法x,其中1 < x < 2.

这是我到目前为止所做的:

uint64_t Log2(uint64_t x, uint8_t precision)
{
    uint64 res = 0;

    uint64 one = (uint64_t)1 << precision;
    uint64 two = (uint64_t)2 << precision;

    for (uint8_t i = precision; i > 0 ; i--)
    {
        x = (x * x) / one; // now 1 < x < 4
        if (x >= two)
        {
            x >>= 1; // now 1 < x …
Run Code Online (Sandbox Code Playgroud)

c optimization performance logarithm fixed-point

6
推荐指数
1
解决办法
441
查看次数

为什么标准同时提供is_integer和is_exact?

std::numeric_limits 提供2个互斥的常量:

  • is_integer :" true对于所有整数算术类型T"

  • is_exact:" true对于T使用精确表示的所有算术类型"

是否存在非精确积分类型的可能性?在这里试图允许什么?

在我所有的模板中,我知道我是否正在处理精确的数字,我用过is_integer,我现在还需要添加支票is_exact吗?

c++ floating-point integer fixed-point numeric-limits

6
推荐指数
1
解决办法
153
查看次数

在C++中将double转换为固定小数点

我在C++中有一个双变量,并希望将其作为固定的小数点数打印到屏幕上.

基本上我想知道如何编写一个带有一个小数位和一些小数位的函数,并将数字打印到该小数位数,必要时填充零.

例如:

convert(1.235, 2)
Run Code Online (Sandbox Code Playgroud)

会打印出来的

1.24
Run Code Online (Sandbox Code Playgroud)

 convert(1, 3)
Run Code Online (Sandbox Code Playgroud)

会打印出来的

1.000
Run Code Online (Sandbox Code Playgroud)

所以这个功能就像

convert(number as double, number of decimal places)
Run Code Online (Sandbox Code Playgroud)

并简单地将所需的值打印到标准输出(cout).

有谁知道如何做到这一点?

提前致谢.

c++ fixed-point decimal

5
推荐指数
1
解决办法
5578
查看次数

Java中具有快速性能的定点算法

我需要用Java精确地表示一些数字,并在小数点后固定小数点的数量;小数点后,我不在乎。(更具体地说-金钱和百分比。)

我现在使用Java自己的BigDecimal,但发现它确实很慢,并且开始在我的应用程序中显示。

因此,我想用“规则”整数和定点算术(长整数具有足够大的精度满足我的目的)来解决它。

现在,我想我不是第一个遇到这种问题的人,并且已经有一个针对该问题的库,该库已经实现了乘法/除法-但似乎并非如此。

现在,我很可能可以自己写(也许我会写),但是,实际上,我真的是第一个需要它的人吗?还没有图书馆吗?

java fixed-point

5
推荐指数
2
解决办法
1万
查看次数

浮点运算结果的再现性

浮点算术运算是否有可能在不同的CPU上产生不同的结果?CPU是指x86和x64的全部内容.并且通过不同的结果,我的意思是即使只有一个最不重要的位是不同的.我需要知道我是否可以在项目上使用浮点运算,这对于在不同的机器上具有与相同输入相对应的完全相同的结果是至关重要的.

编辑:添加了c ++标签.
还要澄清一下:我需要可重复的结果运行时间.我不希望不同编辑的结果相同.

c++ floating-point fixed-point

5
推荐指数
1
解决办法
836
查看次数

64位定点乘法错误

我正在C#中实现64位定点签名31.32数字类型long.到目前为止,添加和减法都很好.然而,乘法有一个我想要解决的烦人案例.

我当前的算法包括将每个操作数分成最高和最低有效32位,执行4次乘法到4个长度并添加这些长度的相关位.这是代码:

public static Fix64 operator *(Fix64 x, Fix64 y) {

    var xl = x.m_rawValue; // underlying long of x
    var yl = y.m_rawValue; // underlying long of y

    var xlow = xl & 0x00000000FFFFFFFF; // take the 32 lowest bits of x
    var xhigh = xl >> 32; // take the 32 highest bits of x
    var ylow = yl & 0x00000000FFFFFFFF; // take the 32 lowest bits of y
    var yhigh = yl >> 32; // …
Run Code Online (Sandbox Code Playgroud)

c# math binary fixed-point

5
推荐指数
1
解决办法
886
查看次数

无符号数的不动点乘法

我试图解决定点数的乘法问题.数字是32位.我的架构是8位.所以这里:

  1. 我使用8.8表示法,即8表示整数,8表示分数.

  2. 我有A78这是10.468.我把它的两个补码,答案是FFFFF588,我将其截断为16位作为F588并存储它.原因是,我只想乘两个2字节的数字.

  3. 现在,当我将这个F588(负10.42或0x0A78)乘以0xFF4B(这是两个对0x00B5(0.707)的补码)时,答案应为0x0766.或类似的东西.

另一方面,我得到的是66D8.

现在这里有趣的地方:如果我将B5的负数存储在32位的两个恭维中,我得到0xFF5266D8,我向右移8位,截断到16位,答案是0x5266.

另一方面,如果我将负的10.42存储在32位中,我得到0xF58F66D8,它在移位8位后截断变为8F66.

但是,如果我以32位格式存储这两个数字,那么只有在移位和截断后才能得到正确的结果,即0x0766.

为什么会这样?我知道当我们从32位到16位时,信息丢失是固有的,但0x07与0x55有很大的不同.我将非常感谢您的回复.

c numbers fixed-point

5
推荐指数
1
解决办法
1065
查看次数

有符号和无符号整数乘法

在定点数学中,我使用了大量的16位信号,并使用32位中间结果进行乘法运算.例如:

int16_t a = 16384; //-1.0q14  or 1.0*2^14
int16_t b = -24576; // -1.4q14  or 1.4*2^14
int16_t c; // result will be q14

c = (int16_t)(((int32_t)a * (int32_t)b)>>14);
Run Code Online (Sandbox Code Playgroud)

让我们说a是q14数,然后c与b具有相同的比例.

这很好,适用于无符号和带符号的算术.

问题是:如果我要混合类型会发生什么?例如,如果我知道乘数"a"总是在0.0到1.0的范围内,那么很容易使它成为无符号整数q15以获得额外的精度(并将移位计数更改为15).但是,我从未理解如果你试​​图在C中乘以有符号和无符号数并避免它会发生什么.在ASM中,我不记得在任何架构上都存在可以与混合类型一起使用的乘法指令,所以即使C做了正确的事情,我也不确定它会生成有效的代码.

我是否应该继续不在定点代码中混合签名的无符号类型?或者这可以很好地工作吗?

c math types fixed-point multiplication

5
推荐指数
1
解决办法
2万
查看次数

PHP bcmath与Python Decimal

我正在使用PHP的bcmath库来执行定点数的操作.我期望获得Python Decimal类的相同行为,但我很惊讶地发现以下行为:

// PHP:
$a = bcdiv('15.80', '483.49870000', 26);
$b = bcmul($a, '483.49870000', 26);
echo $b;  // prints 15.79999999999999999999991853
Run Code Online (Sandbox Code Playgroud)

Decimal在Python中使用s我得到:

# Python:
from decimal import Decimal
a = Decimal('15.80') / Decimal('483.49870000')
b = a * Decimal('483.49870000')
print(b)  # prints 15.80000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

这是为什么?当我使用它来执行非常敏感的操作时,我想找到一种方法来在PHP中获得与Python相同的结果(即(x / y) * y == x)

php python fixed-point decimal bcmath

5
推荐指数
1
解决办法
451
查看次数