问题标签 [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 投票
3 回答
2319 浏览

c# - 如何以确定的方式将 IEEE754 浮点数转换为定点数?

我需要将 32 位 IEEE754 浮点数转换为有符号的 Q19.12 定点格式。问题是它必须以完全确定的方式完成,所以通常的 (int)(f * (1 << FRACTION_SHIFT)) 是不合适的,因为它使用非确定性浮点数学。是否有任何“位摆弄”或类似的确定性转换方法?

编辑:在这种情况下确定性假设为:给定相同的浮点数据在不同平台上实现完全相同的转换结果。

0 投票
4 回答
16755 浏览

java - java中具有快速性能的定点算术

我需要在 Java 中以完美的精度和固定的小数点后数来表示一些数字;在那个小数点之后,我不在乎。(更具体地说 - 金钱和百分比。)

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

所以我想用“常规”整数和定点算术来解决它(长整数对于我的目的来说有足够大的精度)。

现在,我认为我不是第一个遇到这种问题的人,并且已经有一个库,已经实现了乘法/除法 - 但似乎不是。

现在,我很可能可以自己写(我可能会),但真的,我真的是第一个需要这个的人吗?不是已经有一些图书馆吗?

0 投票
2 回答
1022 浏览

c++ - 浮点运算结果的再现性

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

编辑:添加了 c++ 标签。
还要澄清:我需要可重现的结果运行时。我不希望从不同的编译中得到相同的结果。

0 投票
2 回答
506 浏览

image-processing - 有没有办法强制 PMULHRSW 将 0x8000 视为 1.0 而不是 -1.0?

为了处理 8 位像素,在不丢失信息的情况下进行伽马校正等操作,我们通常对值进行上采样,以 16 位或其他方式工作,然后将它们下采样到 8 位。

现在,这对我来说是一个新领域,所以请原谅不正确的术语等。

出于我的需要,我选择在“非标准”Q15 中工作,我只使用范围的上半部分 (0.0-1.0),并且 0x8000 代表 1.0 而不是 -1.0。这使得在 C 中计算事物变得更加容易。

但是我遇到了SSSE3的问题。它具有将 Q15 数字相乘的 PMULHRSW 指令,但它使用 Q15 的“标准”范围是 [-1,1-2⁻¹⁵],因此将(我的)0x8000(1.0)乘以 0x4000(0.5)得到 0xC000(- 0.5),因为它认为 0x8000 是 -1。这很烦人。

我究竟做错了什么?我应该将像素值保持在 0000-7FFF 范围内吗?这不是违背了它作为定点格式的目的吗?有没有解决的办法?也许有什么技巧?

Q15 是否有某种明确的论文来讨论这一切?

0 投票
1 回答
778 浏览

fixed-point - 将定点转换为实际值(十进制)

我的微控制器通过 ASIC IC 提供定点格式 Q24(24 位)的原始数据。

我需要转换为十进制

在哪里

范围原始数据是 0 ~ 10066329

我想将实际值计算为 uint 32bit,并将精度保持在小数点后 2 或 3 位。

例如,如果满量程原始数据是10066329,精确到小数点后 2 位的实际值将是15000或 小数点后 3 位150000

我发现这样做的方法是 - 比例因子(但需要降低原始数据精度以防止数据在 32 位中不溢出) - 浮点(使 MCU 没有效率)

我应该选择什么选项?

我也在这里发过

0 投票
2 回答
8532 浏览

python - 如何强制 Python 将整数保留在科学记数法之外

我正在尝试在 Python 3.2 中编写一个加密短语然后解密它的方法。问题是这些数字太大了,以至于当 Python 对它们进行数学运算时,它会立即将其转换为科学记数法。由于我的代码需要所有数字来使用科学记数法,所以这没有用。

我所拥有的是:

基本上,我只是从用户那里得到一个数字并对其进行一些数学运算。

我已经尝试过format()和其他几件事,但我无法让它们工作。

编辑:我只使用偶数。

0 投票
3 回答
453 浏览

c++ - 如何确定在给定(游戏)项目上使用定点数的可行性?

因为我的案例与游戏项目有关,所以我考虑在GameDev上发布这个问题,但我认为这更适合更广泛的编程 SE。请让我知道这个问题是否会更好地发布在那里。

根据我的理解——如果我错了,请纠正我——移动游戏开发(这是我的情况)可以从使用定点计算中受益匪浅,因为这将确保平台之间的更多一致性,并且会提高性能设备无法正确处理浮点的情况。

但是定点确实有局限性,最明显的是溢出。所以我的问题是,假设我们已经确定定点是给定目标平台的最佳选择,如何确定给定项目的要求是否允许使用它们。

为了让事情更清楚,我想分享一些我遇到问题的代码:

在这个项目中,我使用Marmalade SDK,它使用 C++ 并带有自己的定点数实现(它们有 16 位和 32 位,我现在使用的是 32 位)和一个 Vector 类(CIwVec2) 使用该实现进行位置和计算(包括标量乘法,如上面的代码所示)。哦,IW_FIXED 只是一个将浮点数转换为定点数的宏。

当我尝试运行上述代码时,出现乘法溢出错误。调试值如下:

老实说,我对定点数没有完全的了解。我理解这个想法,但是定点运算对我来说并不完全清楚(我一定已经放弃了大多数与基数 2 相关的数学课,真让我感到羞耻)。但是我完全被这样一个事实所震惊,像 1.0f * 400.0f 这样简单的东西会导致定点溢出。

所以,虽然我认为在我的项目中支持定点不会有问题,但似乎情况并非如此。该游戏是一个自上而下的汽车游戏,不会有巨大的轨道或任何东西,但它们必须至少与设备的屏幕一样大(或者更好的是,它的分辨率),因为我们的目标是对于平板电脑来说,像 1.0f * 400.0f 这样的问题意味着定点是不可能的。

我对这个假设是否正确?而且,对于未来的项目和其他有类似问题的人,我们如何评估项目中定点数的可行性?此外,如何在 16 位和 32 位之间做出决定将是一个很大的好处:)

(对不起,很长的帖子,感谢您的时间!)

更新:

所以,总结一下到目前为止的一些反应。理想的情况是以某种方式实现您的定点数,以便具有满足您需求的必要范围(Mooing Duck 的回答)。此外,对于 32 位数字的操作,最安全的做法是使用 64 位进行计算(timday 的答案和 Max 的评论)。顺便说一句,Marmalade 确实有一些“安全的固定乘法”函数,但对于 CIwVec2 的标量乘法运算符重载(它IW_FIXED_MUL在下面使用,它不能安全地乘法),情况并非如此。

最后,关于我的特定场景,似乎从 Marmalade 6.1 开始,仅使用浮点数可能是最好的解决方案。

编辑: 虽然 Max 的回答确实解决了我的问题,但这主要是因为它是果酱特有的东西。正因为如此,我选择了 Mooing Duck 的答案作为选择的答案,因为我觉得它通常会帮助更多的人。

0 投票
2 回答
854 浏览

c++ - 为什么要以这种方式执行乘法?

我遇到了这个功能:

内联评论是我的。似乎它所做的只是将这两个参数相乘。这是正确的,还是还有更多?为什么会这样做呢?

0 投票
4 回答
430 浏览

c# - 如何进行定点除法?

我有一个使用 long 的 8 字节定点数,其恒定分母为 (1 << 24)。如何对两个 Fixed8 值进行除法?由于我使用的是 C#,因此我不能简单地转换为更大的整数。还是我在语言上想太多了?

谢谢。

0 投票
2 回答
835 浏览

double - 定点 <-> 双精度

我需要有关签名转换的见解。

保证 C 例程的输入位于 -Pi 到 pi 的范围内。这是通过“双”数据类型传递的。

由于我的设备缺少 FPU,我必须使用 24 位寄存器上的定点对输入执行数学运算(将输入除以 Pi)。

由于范围是已知的,我能够以 Q3.10 格式存储输入数据。

所以:

我可以使用古老的 printf 验证打印出的分数。

因此,对于诸如 2.5678 之类的输入,该分数被正确识别为 0.81483。

负数的处理方式相同吗?

当我通过 -1.757 时,上面的计算失败。printf 报告正分数 1.442410。但是 FP_DataQ123 的十六进制值似乎没问题(0xB8a0e8)。符号位正确设置为 1。

我后来这样做了:

printf 现在报告正确的分数 0.557,但没有减号。

如何在不补充 FP_DataQ123 的情况下让 printf 打印 -0.557?