定点的 2 次幂近似

2023-12-01

目前,我正在使用一个小型查找表和线性插值,它非常快且足够准确(最大误差小于 0.001)。然而我想知道是否有一个更快的近似值。

由于指数的整数部分可以通过位移位来提取和计算,因此近似值只需在 [-1,1] 范围内工作 我试图找到切比雪夫多项式,但对于低阶多项式无法达到良好的精度。我猜我可以忍受 0.01 左右的最大误差,但我没有接近这个数字。高阶多项式不是一种选择,因为它们比我当前的基于查找表的解决方案效率低得多。


由于没有说明具体的定点格式,我将演示使用表查找的可能替代方案s15.16定点运算,相当常用。基本思想是分割输入a成不可分割的一部分i和小数部分f,使得f在 [-0.5,0.5] 中,然后使用极小极大多项式近似exp2(f)在 [-0.5, 0.5] 上并根据i.

可以使用 Mathematica、Maple 或 Sollya 等工具生成极小极大近似。如果这些工具均不可用,则可以使用 Remez 算法的自定义实现来生成极小极大近似值。

应使用霍纳方案来评估多项式。由于使用定点算术,多项式的求值应在中间步骤中将操作数缩放至最大可能范围(即没有溢出),以优化计算的精度。

下面的 C 代码假设应用于有符号整数数据类型的右移会导致算术移位运算,因此负操作数会被适当移位。这是not由 ISO C 标准保证,但根据我的经验,它可以与各种工具链一起正常工作。在最坏的情况下,内联汇编可用于强制生成所需的算术右移指令。

测试的输出包含在fixed_exp2()下面的实现应该如下所示:

testing fixed_exp2 with inputs in [-5.96484, 15)
max. rel. err = 0.000999758

这表明区间 [-5.96484, 15) 内的输入满足所需的 0.001 误差界限。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>

/* compute exp2(a) in s15.16 fixed-point arithmetic, -16 < a < 15 */
int32_t fixed_exp2 (int32_t a)
{
    int32_t i, f, r, s;
    /* split a = i + f, such that f in [-0.5, 0.5] */
    i = (a + 0x8000) & ~0xffff; // 0.5
    f = a - i;   
    s = ((15 << 16) - i) >> 16;
    /* minimax approximation for exp2(f) on [-0.5, 0.5] */
    r = 0x00000e20;                 // 5.5171669058037949e-2
    r = (r * f + 0x3e1cc333) >> 17; // 2.4261112219321804e-1
    r = (r * f + 0x58bd46a6) >> 16; // 6.9326098546062365e-1
    r = r * f + 0x7ffde4a3;         // 9.9992807353939517e-1
    return (uint32_t)r >> s;
}

double fixed_to_float (int32_t a)
{
    return a / 65536.0;
}

int main (void)
{
    double a, res, ref, err, maxerr = 0.0;
    int32_t x, start, end;

    start = 0xfffa0900;
    end = 0x000f0000;
    printf ("testing fixed_exp2 with inputs in [%g, %g)\n",  
            fixed_to_float (start), fixed_to_float (end));

    for (x = start; x < end; x++) {
        a = fixed_to_float (x);
        ref = exp2 (a);
        res = fixed_to_float (fixed_exp2 (x));
        err = fabs (res - ref) / ref;
        if (err > maxerr) {
            maxerr = err;
        }
    }
    printf ("max. rel. err = %g\n", maxerr);
    return EXIT_SUCCESS;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定点的 2 次幂近似 的相关文章

  • C# 中的定点数学

    C 中有一些关于定点数学的好资源吗 我见过这样的事情 http 2ddev 72dpiarmy com viewtopic php id 156 和这个 进行定点数学运算的最佳方法是什么 以及一些关于小数是真正定点还是实际上浮点的讨论 更新
  • 有没有办法模糊匹配或提供分数作为行值应与哪个 ID 或组关联的假设?

    我有一个看起来像这样的数据集 structure list ID c 1 2 3 4 5 6 7 8 9 10 Date c 2020 01 n04 2020 04 03 2020 12 10 2020 09 12 2020 11 19 2
  • 没有 64 位临时值的定点乘法

    您好 我正在为嵌入式系统实现一些定点数学内容 并且我正在尝试执行两个 16 16 定点数的乘法而不创建 64 位临时数字 到目前为止 这是我想出的生成最少指令的代码 int multiply int x int y int result l
  • 模拟定点除法/乘法

    我正在编写一个定点类 但遇到了一些障碍 乘法 除法部分 我不知道如何模拟 我对部门操作员进行了非常粗暴的批评 但我确信这是错误的 到目前为止 它看起来是这样的 class Fixed Fixed short int value short
  • 50 次迭代后,常数“pi”的近似值并没有变得更好

    在 R 中我写了这个函数 ifun lt function m o c for k in 1 m o k prod 1 k prod 2 1 k 1 o sum 2 1 sum o Final result print o sum 该函数近
  • c 中浮动奇怪的不精确错误[重复]

    这个问题在这里已经有答案了 今天发生在我身上的一件奇怪的事情 当我尝试编译和执行这段代码的输出不是我所期望的 下面的代码只是将浮点值添加到浮点数组中 然后将其打印出来 简单的代码 int main float r 10 int z int
  • 如何将两个定点数相乘?

    我目前正在尝试找出如何以定点表示形式将两个数字相乘 假设我的数字表示如下 SIGN 2 0 2 1 2 2 2 14 就我而言 数量10 01000000000000 0 25 例如我会怎么做0 25x0 25 or 0 25x0 25 e
  • 我可以分解大规模的相关矩阵吗?

    相关矩阵太大 50000 50000 以至于计算我想要的东西效率不高 我想做的是将其分解为组并将每个组视为单独的相关矩阵 但是 如何处理这些较小的相关矩阵之间的依赖性 我一整天都在网上研究 但没有任何结果 应该有一些算法与像这样的大相关矩阵
  • 浮点和定点表示的优缺点[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在过去的三天里 我一直在尝试理解浮点表示和定点表示之间的确切区别 我在阅读这些材料时感到困惑 无法确定什么是对的 什么是错的 问题之一
  • 如今何时使用定点

    对于密集的数字运算 我正在考虑使用定点而不是浮点 当然 定点类型的大小有多少字节 它将在什么 CPU 上运行 如果我可以使用 对于英特尔 MMX 或 SSE 或任何新出现的东西 这都很重要 我想知道现在浮点运行速度比以往任何时候都快 是否值
  • 有效地选择随机数

    我有一个方法 它使用随机样本来近似计算 该方法被调用数百万次 因此选择随机数的过程是否高效非常重要 我不确定java有多快Random nextInt确实如此 但我的程序似乎并没有像我希望的那样受益 选择随机数时 我执行以下操作 以半伪代码
  • 如何在浮点上使用 expr?

    我知道这是一个非常愚蠢的问题 但我不知道如何在 bash 中做到这一点 20 30 100 它应该是66 67但 expr 说0 因为它不支持浮动 Linux 中的什么命令可以代替 expr 并执行此等式 bc将为您执行此操作 但顺序很重要
  • 在mysql中存储金额

    我想将 3 50 存储到 mysql 表中 我有一个浮点数 将其存储在其中 但它存储为 3 5 而不是 3 50 我怎样才能让它有尾随零 不要将货币值存储为浮点数 请使用 DECIMAL 或 NUMERIC 类型 MySQL 数字类型文档
  • 用于移动物体的近似增量最近邻算法

    Bounty 这个问题提出了几个问题 赏金将用于全面解决这些问题的答案 这是我一直在玩的一个问题 NOTE我对以下解决方案特别感兴趣不基于欧几里得空间 有一组 Actor 形成大小为 K 的人群 距离d ActorA ActorB 对于任何
  • 在 C++ 中使用什么来表示定点? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找用于财务数据的定点标准 您知道有哪些值得尝试吗 您对手工制作的定点类的性能有什么经验吗 Dr
  • 无法使用神经网络近似正弦函数

    我正在尝试使用我自己编写的神经网络来近似 sine 函数 我已经在一个简单的 OCR 问题上测试了我的神经网络并且它有效 但我在将其应用于近似 sine 时遇到了困难 我的问题是 在训练过程中 我的误差恰好收敛于 50 所以我猜它是完全随机
  • 如何使用Python将浮点数转换为具有预定义位数的定点数

    我有 numpy 格式的 float 32 个数字 假设是正数 我想将它们转换为具有预定义位数的定点数以降低精度 例如 数字 3 1415926 在 matlab 中通过使用函数 num2fixpt 变为 3 25 命令是 num2fixp
  • 64 位定点乘法错误

    我正在 C 中实现一个 64 位定点有符号 31 32 数字类型 基于long 到目前为止 加法和减法都很顺利 然而 乘法有一个我正在尝试解决的恼人的情况 我当前的算法包括将每个操作数分为最高和最低有效 32 位 执行 4 次乘法分为 4
  • 当一个数字完全整除时,如何在 python 中显示两个小数点?

    目前我正在尝试解决一个问题 我应该将答案打印到小数点后两位不四舍五入 我为此目的使用了以下代码 import math a 1 175 value of a after some division print math floor a 10
  • 大量点的贝塞尔曲线近似

    我有大约一百个点 我想用贝塞尔曲线来近似 但如果超过 25 个点 或类似的点 组合数量的阶乘计数会导致数字溢出 有没有一种方法可以以类似贝塞尔曲线的方式近似如此数量的点 平滑曲线 无需经过所有点 除了第一个和最后一个点 或者我是否需要选择另

随机推荐

  • 在VB.NET中捕获功能键F1..F12 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 I cannot capture the functi
  • 未找到续集关联者

    我有一个项目正在尝试使用sequelize 它可以很好地创建数据库和表 但它永远找不到关联类方法 因此它永远不会调用关联方法 此代码可以很好地创建表 使用导入方法 但 Object keys db 会迭代每个模型 但它永远找不到关联方法 f
  • FFmpeg 无需解码视频即可获取运动向量

    我想访问 h264 视频流的运动向量而不解码视频 我知道这显示了视频和运动矢量 ffplay i myvideo avi flags2 export mvs vf codecview mv pf bf bb 如何避免解码整个视频以节省 CP
  • 如何通过传递特定日期来确定星期几?

    例如 我的日期是 23 2 2010 2010 年 2 月 23 日 我想将它传递给一个函数 该函数将返回星期几 我怎样才能做到这一点 在此示例中 该函数应返回String Tue 此外 如果只需要日期序号 如何检索 是的 根据您的具体情况
  • 如何使用迭代器在向量中导航? (C++)

    目标是访问字符串向量的 第 n 个元素 而不是 运算符或 at 方法 据我了解 迭代器可用于在容器中导航 但我以前从未使用过迭代器 而且我正在阅读的内容令人困惑 如果有人能给我一些关于如何实现这一目标的信息 我将不胜感激 谢谢 您需要利用b
  • 如何计算多线程进程的总计算时间

    我有一组任务 我们称之为T 其中每个任务T i 需要一定的时间t T i 待处理 这些任务正在并行处理X线程 这并不是说多个线程共同处理单个任务 而是多个线程正在处理多个任务 每个线程执行一个任务 然后执行下一个任务 依此类推 现在我想计算
  • geom_hexbin 将 bincount 映射到 alpha

    我希望将 geom hex bincount 设置为 alpha 就像完成的那样here 不知怎的 它对我不起作用 可能出了什么问题 ggplot2 的开发版本 library ggplot2 library reshape2 dm lt
  • 在随机字符串内使用正则表达式匹配日期

    我正在尝试这样做Java 我收到这种字符串 12 07 2004dddsss12 10 2010 rr r r10 01 2000ksdifjsdifffffdd04 04 1998 然后我必须在该字符串中找到一个或多个日期 日期格式 dd
  • 如何使用 UITypeEditor 创建简单的 Visual Studio Automation Extender

    在 Visual Studio 中 当您在解决方案资源管理器中选择项目或项目项时 有时您可能希望将自定义属性添加到属性窗口 按 F4 时弹出的窗口 此外 为了填写这些属性的值 我需要添加一个按钮来弹出表单 以便我可以在设计时从用户那里收集信
  • Python Pydub 权限被拒绝?

    当我运行这段代码时 from pydub import AudioSegment sound AudioSegment from mp3 i mp3 sound export F bh format wav A ffmpeg window
  • 使用 chromedriver 从 Selenium 打印 PDF

    我正在尝试使用 Selenium chromedriver 和 python 实现将 html css 内容打印为 PDF 我可以使用以下代码进行打印 但无法更改打印设置 我想以 Letter 尺寸打印 并且没有页眉 页脚 官方信息铬驱动程
  • HTML“no-js”类的目的是什么?

    我注意到在很多模板引擎中HTML5 样板 在各种框架和普通 php 站点中都有no js类添加到 tag 为什么要这样做 是否有某种默认浏览器行为对此类做出反应 为什么总是包含它 如果没有 no no js 情况并且可以直接处理 html
  • 导航抽屉项目图标不显示原始颜色

    我试图在导航抽屉的菜单中的项目旁边显示一个图标 但由于某种原因 该图标始终显示为灰色 而不是原始颜色 棕色 有什么方法可以防止这种情况发生 以显示图标的原始颜色 MainActivity java public class MainActi
  • 如何更改默认 EditText 的样式

    我正在创建三个EditText在我的 xml 文件中使用如下代码
  • Python CSV:读取以逗号终止的行会导致空结果

    如果这是一个愚蠢的问题 请随意骚扰我 因为我自己找不到正确的答案 我正在尝试读取一个 CSV 格式的文件 其中每行都包含数据 并且每行都以逗号终止 像这样 1 1 1 1 当我尝试使用 Python 的 CSV 函数时 我使用以下代码 wi
  • 错误:“struct List”需要模板参数

    我正在尝试为 List 类创建自己的模板作为学习练习 不过 我在模板语法方面遇到了一些问题 现在收到以下错误消息 main cpp Line 8 instantiated from here error template argument
  • 对于 >2 个类别的结果,插入符训练方法不起作用(所有准确性结果都有问题)

    嗨 我知道之前有人问过类似的问题 但还没有明确的答案 或者我尝试了他们的解决方案但没有成功 使用 GBM 时出现插入符错误 但并非没有插入符 插入符训练方法抱怨有问题 所有 RMSE 指标值均缺失 我尝试使用插入符训练方法来预测分类结果 下
  • R.java自动生成文件

    在 android 2 1 和 2 2 中 R java 文件是自动生成的 但在2 0平台中我们必须构建R java文件 任何人都知道如何从程序生成 R java 文件 使用 clean 并在 eclipse 中构建 每次构建 androi
  • 即使设置了内容大小,UIScrollView 也不会滚动

    我的 UIScrollView 是一个约 4500px 的水平视图 用户需要水平滚动才能查看内容 我已将其设置如下 void viewDidLoad super viewDidLoad sview frame CGRectMake 0 0
  • 定点的 2 次幂近似

    目前 我正在使用一个小型查找表和线性插值 它非常快且足够准确 最大误差小于 0 001 然而我想知道是否有一个更快的近似值 由于指数的整数部分可以通过位移位来提取和计算 因此近似值只需在 1 1 范围内工作 我试图找到切比雪夫多项式 但对于