标签: fixed-point

定点乘法算法

我正在尝试将时间戳(仅秒的小数部分)从纳秒(10 ^ -9秒的单位)重新缩放到NTP时间戳的下半部分(单位为2 ^ -32秒).实际上这意味着乘以4.2949673.但我需要在没有浮点数学的情况下完成它,并且不使用大于32位的整数(事实上,我实际上是为8位微控制器编写这个,所以即使32位数学也很昂贵,特别是划分).

我已经提出了一些工作得相当好的算法,但我没有真正的数值方法基础,所以我很欣赏任何有关如何改进它们的建议,或任何其他更准确的算法. /或更快.

算法1

uint32_t intts = (ns >> 16) * 281474 + (ns << 16) / 15259 + ns / 67078;
Run Code Online (Sandbox Code Playgroud)

选择前两个常数略微下冲,而不是超过正确的数字,并且根据经验确定最终因子67078以纠正此问题.产生+/- 4 NTP单位的正确值,结果为+/- 1 ns - 可接受,但残差随之变化ns.我想我可以添加另一个术语.

算法2

uint32_t ns2 = (2 * ns) + 1;
uint32_t intts = (ns2 << 1)
  + (ns2 >> 3) + (ns2 >> 6) + (ns2 >> 8) + (ns2 >> 9) + (ns2 >> 10)
  + (ns2 >> 16) + (ns2 >> 18) + (ns2 …
Run Code Online (Sandbox Code Playgroud)

c fixed-point numerical-methods

8
推荐指数
1
解决办法
3317
查看次数

Python计算错误

我正在使用API​​ mpmath来计算以下总和

让我们考虑一下由下式定义的系列u0,u1,u2:

u0 = 3/2 = 1,5

u1 = 5/3 = 1,6666666…

un+1 = 2003 - 6002/un + 4000/un un-1
Run Code Online (Sandbox Code Playgroud)

系列在2上收敛,但由于四舍五入问题,它似乎在2000年汇合.

n   Calculated value    Rounded off exact value

2   1,800001            1,800000000
3   1,890000            1,888888889
4   3,116924            1,941176471
5   756,3870306         1,969696970
6   1996,761549         1,984615385
7   1999,996781         1,992248062
8   1999,999997         1,996108949
9   2000,000000         1,998050682
10  2000,000000         1,999024390

我的代码:

from mpmath import *
mp.dps = 50
u0=mpf(3/2.0)
u1=mpf(5/3.0)
u=[]
u.append(u0)
u.append(u1)
for i in range (2,11):
    un1=(2003-6002/u[i-1]+(mpf(4000)/mpf((u[i-1]*u[i-2]))))
    u.append(un1)
print u
Run Code Online (Sandbox Code Playgroud)

我的结果不好:

[mpf('1.5'), …
Run Code Online (Sandbox Code Playgroud)

python math floating-point fixed-point arbitrary-precision

8
推荐指数
1
解决办法
731
查看次数

C++编译时bignum库

在C++中是否有任何编译时库(模板元编程)用于任意精度算术?

我需要这个来帮助我的AVR微控制器程序中的定点算术和二进制缩放.例如,当两个数字各自具有自己的边界时,bignums将用于计算结果的边界,并在适当时移动输入和/或输出中的分数点.但是结果的边界可能无法在标准整数类型中表示.

c++ fixed-point bignum compile-time template-meta-programming

8
推荐指数
1
解决办法
520
查看次数

.NET - 为什么C#中没有定点数值数据类型?

看起来固定点数据类型会有很多用途.为什么.NET中没有一个?

注意:我知道我们可以创建自己的类/结构来满足我们的定点目的和需求.那不是我的问题.我想知道为什么MS决定不包括定点数字数据类型.

.net c# fixed-point

7
推荐指数
3
解决办法
8292
查看次数

IEEE浮点数与自定义浮点数性能

我正在处理没有浮点单元的处理器,所以我必须为用户界面使用固定或自定义浮点类型.

对于这三种类型,表示乘法的表现如何:
1.IEEE Float(32)
2.自定义32位浮点类,带有16位有符号值和带符号的16位指数
3. 32位固定小数

我想要一些可扩展到具有浮点单元的处理器的东西,自定义浮点数是否具有IEEE浮点数的竞争性能?我听说IEEE浮点数在没有FPU的处理器上的性能很糟糕,是因为由于24位值不是原生的,它必须做疯狂和/或?也就是说,自定义浮点类会缓解性能问题吗?

任何帮助将不胜感激!

c++ floating-point fixed-point

7
推荐指数
1
解决办法
1207
查看次数

Matlab:如何在不扩展底层数据类型的情况下执行定点运算?

谷歌在这个问题上保持沉默.我目前正在Matlab中仅在16位有符号定点上实现数值计算器.但是对16位定点的算术运算会导致数据类型扩展到以下

>> a = int16(1.5 * 4)
a = 6
>> T = numerictype(1, 16, 2)

T = DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 2
>> dis = reinterpretcast(a, T)

dis = 1.5000

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 2
>> c = dis * dis

c = 2.2500

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 4
Run Code Online (Sandbox Code Playgroud)

我希望变量c保持在WordLength 16,FractionLength 2.是否有可能在不扩展基础数据类型的情况下完成16位定点的算术运算?我将承担任何溢出和下溢的风险.任何帮助都是极好的.

编辑:输入fimath命令窗口会导致错误.为什么会出现此错误?

>> F = …
Run Code Online (Sandbox Code Playgroud)

matlab fixed-point

7
推荐指数
1
解决办法
2453
查看次数

定点 Log2 近似

我已经使用查找表和低阶多项式近似实现了定点 log2 函数,但对整个 32 位定点范围 [-1,+1) 的精度不太满意。输入格式为s0.31,输出格式为s15.16。

我在这里发布这个问题,以便其他用户可以发布他的答案(一些评论在另一个线程中交换,但他们更喜欢在单独的线程中提供全面的答案)。欢迎任何其他答案,如果您能提供算法及其实现的一些速度与准确性的详细信息,我将不胜感激。

谢谢。

logarithm fixed-point polynomials

7
推荐指数
1
解决办法
4409
查看次数

如何将浮点算法转换为定点?

在阅读了很多有关定点算术的知识之后,我想我可以说我已经理解了基础知识,但是不幸的是,我还不知道如何转换使用sin / cos / sqrt或任何其他fp函数的例程。

考虑一下这个简单的mcve:

#include <math.h>
#include <stdio.h>
#include <ctime>
#include <fstream>
#include <iostream>

typedef char S8;
typedef short S16;
typedef int S32;
typedef unsigned char U8;
typedef unsigned short U16;
typedef unsigned int U32;
typedef float F32;
typedef double F64;

// -------- Fixed point helpers QM.N(32bits) --------
typedef S32 FP32;

#define LUT_SIZE_BITS 9  // 0xffffffff>>(32-9)=511; 32-23=9; 2^9=512
#define LUT_SIZE 512

#define FRACT_BITS 28        // Number fractional bits
#define M (1 << FRACT_BITS)  // Scaling factor

inline F32 …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point optimization fixed-point

7
推荐指数
1
解决办法
491
查看次数

计算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
查看次数