我正在尝试将时间戳(仅秒的小数部分)从纳秒(10 ^ -9秒的单位)重新缩放到NTP时间戳的下半部分(单位为2 ^ -32秒).实际上这意味着乘以4.2949673.但我需要在没有浮点数学的情况下完成它,并且不使用大于32位的整数(事实上,我实际上是为8位微控制器编写这个,所以即使32位数学也很昂贵,特别是划分).
我已经提出了一些工作得相当好的算法,但我没有真正的数值方法基础,所以我很欣赏任何有关如何改进它们的建议,或任何其他更准确的算法. /或更快.
uint32_t intts = (ns >> 16) * 281474 + (ns << 16) / 15259 + ns / 67078;
Run Code Online (Sandbox Code Playgroud)
选择前两个常数略微下冲,而不是超过正确的数字,并且根据经验确定最终因子67078以纠正此问题.产生+/- 4 NTP单位的正确值,结果为+/- 1 ns - 可接受,但残差随之变化ns.我想我可以添加另一个术语.
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) 我正在使用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) 在C++中是否有任何编译时库(模板元编程)用于任意精度算术?
我需要这个来帮助我的AVR微控制器程序中的定点算术和二进制缩放.例如,当两个数字各自具有自己的边界时,bignums将用于计算结果的边界,并在适当时移动输入和/或输出中的分数点.但是结果的边界可能无法在标准整数类型中表示.
c++ fixed-point bignum compile-time template-meta-programming
看起来固定点数据类型会有很多用途.为什么.NET中没有一个?
注意:我知道我们可以创建自己的类/结构来满足我们的定点目的和需求.那不是我的问题.我想知道为什么MS决定不包括定点数字数据类型.
我正在处理没有浮点单元的处理器,所以我必须为用户界面使用固定或自定义浮点类型.
对于这三种类型,表示乘法的表现如何:
1.IEEE Float(32)
2.自定义32位浮点类,带有16位有符号值和带符号的16位指数
3. 32位固定小数
我想要一些可扩展到具有浮点单元的处理器的东西,自定义浮点数是否具有IEEE浮点数的竞争性能?我听说IEEE浮点数在没有FPU的处理器上的性能很糟糕,是因为由于24位值不是原生的,它必须做疯狂和/或?也就是说,自定义浮点类会缓解性能问题吗?
任何帮助将不胜感激!
谷歌在这个问题上保持沉默.我目前正在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) 我已经使用查找表和低阶多项式近似实现了定点 log2 函数,但对整个 32 位定点范围 [-1,+1) 的精度不太满意。输入格式为s0.31,输出格式为s15.16。
我在这里发布这个问题,以便其他用户可以发布他的答案(一些评论在另一个线程中交换,但他们更喜欢在单独的线程中提供全面的答案)。欢迎任何其他答案,如果您能提供算法及其实现的一些速度与准确性的详细信息,我将不胜感激。
谢谢。
在阅读了很多有关定点算术的知识之后,我想我可以说我已经理解了基础知识,但是不幸的是,我还不知道如何转换使用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) 我正在开发一个定点平台(不支持浮点运算).
我将任何有理数表示q为q * (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) std::numeric_limits 提供2个互斥的常量:
is_integer :" true对于所有整数算术类型T"
is_exact:" true对于T使用精确表示的所有算术类型"
是否存在非精确积分类型的可能性?在这里试图允许什么?
在我所有的模板中,我知道我是否正在处理精确的数字,我用过is_integer,我现在还需要添加支票is_exact吗?
fixed-point ×10
c++ ×4
c ×2
logarithm ×2
optimization ×2
.net ×1
bignum ×1
c# ×1
compile-time ×1
integer ×1
math ×1
matlab ×1
performance ×1
polynomials ×1
python ×1