问题标签 [fixed-point]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
65406 浏览

c++ - 做定点数学的最佳方法是什么?

我需要为没有 FPU 的 Nintendo DS 加速一个程序,所以我需要将浮点数学(模拟且缓慢)更改为定点。

我是如何开始的,我将浮点数更改为整数,每当需要转换它们时,我使用x>>8将定点变量 x 转换为实际数字,并使用x<<8转换为定点。很快我发现不可能跟踪需要转换的内容,并且我还意识到很难更改数字的精度(在这种情况下为 8。)

我的问题是,我应该如何使这更容易并且仍然快速?我应该制作一个 FixedPoint 类,还是只制作一个 FixedPoint8 typedef 或带有一些函数/宏的结构来转换它们,或者其他什么?我应该在变量名中添加一些东西来显示它的定点吗?

0 投票
7 回答
4704 浏览

c++ - 你在 C++ 中使用什么来表示定点?

我正在寻找用于财务数据的定点标准,您知道有什么值得尝试的吗?你对那个手工定点类的性能有什么经验吗?

0 投票
6 回答
10378 浏览

language-agnostic - 反转 4x4 矩阵 - 需要数值最稳定的解决方案

我想反转一个 4x4 矩阵。我的数字以定点格式存储(准确地说是 1.15.16)。

使用浮点算术,我通常只构建伴随矩阵并除以行列式(例如蛮力解决方案)。到目前为止,这对我有用,但是在处理定点数时,由于使用了所有乘法,我得到了不可接受的精度损失。

注意:在定点算术中,我总是丢弃一些立即结果的最低有效位。

那么-反转矩阵的最稳定的数值方法是什么?我不太在意性能,但简单地使用浮点会减慢我的目标架构。

0 投票
7 回答
3832 浏览

optimization - 这些天什么时候使用定点

对于激烈的数字运算,我正在考虑使用定点而不是浮点。当然,定点类型的大小有多少字节,它将在什么 CPU 上运行,我是否可以使用(对于英特尔)MMX 或 SSE 或任何新事物出现……

我想知道这些天浮点运行速度是否比以往任何时候都快,是否值得考虑定点?是否有一般的经验法则,我们可以说它会影响超过几个百分点?35,000 英尺的数值性能概述是什么?(顺便说一句,我假设大多数计算机都使用通用 CPU,而不是 DSP 或专用嵌入式系统。)

0 投票
6 回答
50376 浏览

c++ - 将浮点数转换为定点数

在 C++ 中,将任何浮点值 (float) 转换为定点(int、16:16 或 24:8) 的通用方法是什么?

编辑:为澄清起见,定点值有两个部分:整数部分和小数部分。整数部分可以用有符号或无符号整数数据类型表示。小数部分由无符号数据整数数据类型表示。

为了清楚起见,让我们用金钱做一个类比。小数部分可能代表美分——一美元的小数部分。'cents' 数据类型的范围是 0 到 99。如果将 8 位无符号整数用于定点数学,那么小数部分将被分成 256 个可整除的部分。

我希望这能解决问题。

0 投票
3 回答
6480 浏览

sql-server-2005 - 在 SQL Server 2005 中将值转换为 FLOAT 时出错

我正在尝试让一个存储过程为生病的同事工作(因此不能要求指导)。

我有一个具有此确切过程的 SQL Server 2005 数据库,并且我正在尝试制作脚本来转换测试数据库以匹配此开发数据库。我的脚本有几行,如:

该过程本质上是“从另一个表中插入表(所有字段),其中字段 = @input”

当我运行脚本时,我收到错误:

并且没有创建该过程。但是,我比较了开发和测试环境中的源表,它们完全匹配。并且该过程完全按照开发环境中的脚本存在。

我不能问我的同事是否必须做任何特殊的杂技来创作这个剧本,所以我问你。我进行了一些搜索,发现 float 应该是 FLOAT(6,1) (或类似的)形式,但这不是他所拥有的,而且我不愿意更改测试环境以使其获胜与开发人员不符。

添加

评论者是正确的。我被告知错误与以下演员有关:

我可以发布整个查询,但它很长!所以,相反,我将只包括强制转换的字段,以及第一个和最后一个字段。我想问一下我的同事,那一个领域是否有误,只需要直接转换即可。他下周一就会回来,所以可能需要等那么久。

our_File_CHAR 定义为

our_File 定义为

0 投票
5 回答
67578 浏览

oracle - Oracle 浮点数与数字

我在Oracles 文档中看到相互冲突的引用。小数如何存储在 FLOAT 和数据库中的 NUMBER 类型之间有什么区别吗?

正如我从 C 等人中回忆的那样,浮点数具有 int 没有的精度限制。Rg,对于“浮点数”,0.1(以 10 为底)近似为 0.110011001100110011001101(以 2 为底),大致等于 0.100000001490116119384765625(以 10 为底)。然而,对于 'int's,5(Base 10) 正好是 101(Base 2)。

这就是为什么以下内容不会在 C 中按预期终止的原因:

但是,我在 Oracle 文档的其他地方看到FLOAT 已被定义为 NUMBER。据我了解,Oracle 对 NUMBER 类型的实现并没有遇到与 C 的浮点数相同的问题。

那么,这里的真实故事是什么?Oracle 是否偏离了我对浮点数/浮点数的预期?

(我敢肯定,对于我将使用它们的用途而言,这是一场巨大的飓风,但我知道如果 0.1*10 等于 1.00000000000000001,我会有疑问)

0 投票
6 回答
37728 浏览

c# - c#中的定点数学?

我想知道这里是否有人知道 c# 中定点数学的任何好的资源?我见过这样的事情(http://2ddev.72dpiarmy.com/viewtopic.php?id=156)和这个(What's the best way to do fixed-point math?),以及一些关于是否十进制的讨论确实是定点或实际上是浮点(更新:响应者已确认它绝对是浮点),但我还没有看到用于计算余弦和正弦之类的可靠 C# 库。

我的需求很简单——我需要基本的运算符,加上余弦、正弦、arctan2、PI……我想就是这样。也许平方。我正在编写一个 2D RTS 游戏,我大部分时间都在工作,但是当使用浮点数学(双打)时,单位移动在多台机器上随着时间(10-30 分钟)有非常小的不准确性,导致不同步。目前这仅在 32 位操作系统和 64 位操作系统之间,所有 32 位机器似乎都保持同步而没有问题,这就是让我认为这是一个浮点问题的原因。

我从一开始就意识到这是一个可能的问题,因此尽可能地限制了我对非整数位置数学的使用,但是为了以不同的速度平滑对角线运动,我正在计算弧度中点之间的角度,然后用 sin 和 cos 获得运动的 x 和 y 分量。这是主要问题。我还在为线段交叉点、线-圆交叉点、圆-矩形交叉点等进行一些计算,这些计算也可能需要从浮点数移动到定点数以避免跨机器问题。

如果有 Java 或 VB 或其他类似语言的开源代码,我可能会转换代码以供我使用。对我来说,首要任务是准确性,尽管我希望在目前的性能上尽可能少地损失速度。这整个定点数学的东西对我来说是非常新的,我很惊讶谷歌上关于它的实用信息如此之少——大多数东西似乎要么是理论,要么是密集的 C++ 头文件。

非常感谢您能为我指明正确方向所做的任何事情;如果我能做到这一点,我计划将我放在一起的数学函数开源,以便为其他 C# 程序员提供资源。

更新:我绝对可以为我的目的制作一个余弦/正弦查找表,但我认为这不适用于 arctan2,因为我需要生成一个包含大约 64,000x64,000 个条目的表(哎呀)。如果您知道任何关于计算诸如 arctan2 之类的有效方法的编程解释,那就太棒了。我的数学背景还可以,但是高级公式和传统的数学符号对我来说很难翻译成代码。

0 投票
4 回答
1782 浏览

c - 静态初始化变量(在编译时)

1)我的 C 算法中有很多常量。2)我的代码在浮点和定点都有效。

现在,这些常量由函数 float2fixed 初始化,因此在浮点中它什么也不做,而在定点中,它找到它们的定点表示。例如,如果工作在浮点数中,0.5f 保持 0.5f,而它使用 pow() 例程,如果工作在定点上,则变为 32768,定点表示为 Qx.16。

这很容易维护,但实际上需要花费大量时间来计算这些定点常量(pow 是一个浮点函数)。在 C++ 中,我会使用一些元编程,因此编译器会在编译时计算这些值,因此在运行时不会受到影响。但在 C 中,这是不可能的。或者是吗?有人知道这样的技巧吗?有没有足够聪明的编译器来做到这一点?

期待任何答案。

一个

0 投票
2 回答
476 浏览

c++ - C/C++ 中的数值转换

我需要将 C/C++ double 转换为 64 位二进制补码,其中 Radix 点位于第 19 位(含)。

这意味着对于我要转换为的格式

  • 0x0000 0000 0010 0000 是数字 1
  • 0xFFFF FFFF FFF0 0000 是数字-1
  • 0x0000 0000 0000 0001 是 0.95 x 10^-6
  • 0xFFFF FFFF FFFF FFFF 为 -0.95 x 10^-6

到目前为止,我一直在使用 C 标准库中的 modf 函数,但这并不能真正满足我的需求。我还查看了 Boost 中的一些类型转换类,但我也找不到合适的解决方案。有谁知道图书馆或简单的方法来进行这种转换?也许更熟悉 Boost 的人可以为我指明正确的方向。

如果有帮助,这里有一些关于如何存储双打的文档。

编辑:

我有一个后续问题,这真的是为了我自己的利益。什么是“基数”?这里有点像小数点。但是,我唯一一次听到基数这个词是在我学习离散快速傅里叶变换的时候。如果我没记错的话,Radix-II 方法很快,因为计算 DFT 所需的乘法更少。