将常数(2 的幂)除以整数的技巧

2023-11-26

NOTE这是一个理论问题。我对实际代码的性能感到满意。我只是好奇是否有替代方案。

有没有一种技巧可以将常量值(本身是 2 的整数幂)除以整数变量值,而无需使用实际的除法运算?

// The fixed value of the numerator
#define SIGNAL_PULSE_COUNT 0x4000UL

// The division that could use a neat trick.
uint32_t signalToReferenceRatio(uint32_t referenceCount)
{
    // Promote the numerator to a 64 bit value, shift it left by 32 so
    // the result has an adequate number of bits of precision, and divide
    // by the numerator.
    return (uint32_t)((((uint64_t)SIGNAL_PULSE_COUNT) << 32) / referenceCount);
}

我找到了几个(很多)关于除以常量(整数和浮点数)的技巧的参考资料。例如,问题整数除以 3 最快的方法是什么?有许多很好的答案,包括对其他学术和社区材料的参考。

鉴于分子是常数,并且它是 2 的整数幂,是否有一个巧妙的技巧可以用来代替实际的 64 位除法?某种按位运算(移位、AND、XOR 之类的东西)或类似的?

我不希望任何精度损失(由于整数舍入而超过可能的半位)大于进行实际除法的精度损失,因为仪器的精度取决于此测量的精度。

"Let the compiler decide" is not an answer, because I want to know if there is a trick.

额外的上下文信息

我正在 16 位数据、24 位指令字微控制器上开发驱动程序。驱动器对外围模块进行了一些处理,以获得固定数量的信号频率脉冲的参考频率的脉冲计数。所需的结果是信号脉冲与参考脉冲的比率,以无符号 32 位值表示。该函数的算术由我正在为其开发驱动程序的设备的制造商定义,并且对结果进行进一步处理以获得浮点实际值,但这超出了本问题的范围。

我正在使用的微控制器有一个数字信号处理器,它有许多我可以使用的除法运算,如果有必要,我不害怕这样做。除了将汇编指令放在一起以使其工作之外,这种方法还需要克服一些小挑战,例如 DSP 用于在 BLDC 驱动器 ISR 中执行 PID 功能,但没有什么是我无法管理的。


你不能使用聪明的数学技巧来不进行除法,但如果你知道引用计数的范围,你当然仍然可以使用编程技巧:

  • 就速度而言,没有什么比预先计算的查找表更好的了。
  • 有快速近似平方根算法(可能已经在您的 DSP 中),您可以通过一到两次 Newton-Raphson 迭代来改进近似值。如果使用浮点数进行计算对您来说足够准确,那么您可能可以在速度方面击败 64 位整数除法(但在代码清晰度方面则不然)。

您提到结果稍后将转换为浮点,根本不计算整数除法,而是使用浮点硬件可能会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将常数(2 的幂)除以整数的技巧 的相关文章

随机推荐

  • python:计算质心

    我有一个包含 4 列的数据集 x y z 和值 比方说 x y z value 0 0 0 0 0 1 0 0 0 2 0 0 1 0 0 0 1 1 0 1 1 2 0 1 2 0 0 0 2 1 0 0 2 2 0 0 我想计算质心CM
  • Python 赋值运算符左侧的多个变量

    有人可以解释一下逗号分隔链的概念吗 可能不是正确的术语 但我不想将其与list 赋值运算符左侧的变量名 我指的是具有以下性质的东西 reader csv reader open some file rb for row in reader
  • 将 GDAL/OGR 合并到 iOS 项目中 - 快速指南

    问题是这样的 GDAL是一个出色的开源库 旨在管理复杂的 GIS 数据 栅格数据和矢量数据 它完全是为Mac OS 由 William Kyngesburye 提供 和其他平台 但不适用于 iOS 浏览网络 您可以找到有关创建 iOS 库主
  • Python Killed:使用从 2 个 csv 文件创建的字典运行代码时为 9

    我正在运行一个一直对我有用的代码 这次我在 2 个 csv 文件上运行它 data 24 MB 和 data1 475 MB data 有 3 列 每列约 680000 个元素 而 data1 有 3 列 每列约 33000000 个元素
  • 更改Jfreechart中图表的X轴起始值

    我正在计算图像红色分量的直方图并将其存储在 redhisto 中 数组的索引代表强度 0到255 该值表示具有该强度的像素数 然后使用 JFreeChart 绘制这些值 我的问题是 如何让X轴的值从0开始 现在是从负数开始 Can we c
  • 术语“全局属性”和“全局变量”是同义词吗?

    全局对象充当顶级词法环境 作用域链的顶部 如果您愿意的话 这意味着可以通过直接引用 如变量 访问全局属性 global code this foo 1 creating a global property foo accessing the
  • 从对象生成 DTO

    我想从我现有的一些对象中自动生成一些 DTO 我想知道是否已经存在可以使用的 Resharper DevExpress 或 VSX 开源工具 我需要一个工具来查看我的代码并让我选择我想要的属性包含在我的 DTO 中 然后基于该生成一个类 另
  • Lighthouse 错误:“表单元素没有关联的标签”

    如何修复此灯塔错误 表单元素没有关联的标签
  • Flutter 按时间戳对 Firebase 快照进行排序

    I m trying to sort snapshot by timestamp but returns original order data structure looks like this 我有两个快照 时间戳是 153602546
  • 电话验证正则表达式

    我正在使用此模式来检查电话号码的验证 0 9 9 15 它适用于0771234567 and 0771234567 但我希望它适用于077 1234567 and 077 1234567和 077 1 23 45 67 和 077 123
  • 在 Verilog 中生成 For 循环中实例化模块

    我正在尝试使用 Verilog 实例化一些模块generate块 因为我将实例化可变数量的它们 genvar i generate for i 1 i lt 10 i i 1 begin status whatever status clk
  • 无法使用 Rails 5.2、AWS S3 和 ActiveStorage 自动加载常量 ActiveStorage::Blob::Analyzable 错误

    我已经和这个家伙战斗了一段时间了 并且已经完成了所有的谷歌 here here 以及许多同样无益的其他人 但无济于事 官方错误是这样的 在我的创建方法的第一行调用 无法自动加载常量 ActiveStorage Blob Analyzable
  • 是否存在 SHA1(x) 等于 x 的 x?

    有没有一个x where SHA1 x x 我正在寻找证据或强有力的论据来反对它 与问题相同的论点适用于此有MD5定点吗 IE 对于随机选择的函数 该值约为 63
  • Lua表的一个有趣现象

    我是Lua新手 这几天正在学习table的用法 从教程中我知道Lua对待数字索引项和非数字索引项的方式不同 所以我自己做了一些测试 今天我发现一个有趣的现象 我无法解释它 The code t 1 2 3 a a b b print t g
  • android webview youtube 嵌入视频自动播放不起作用

    我无法自动播放我的视频 请帮忙 我的sdk版本 android minSdkVersion 14 android targetSdkVersion 19 gt 我尝试按照代码中指定的方式放置 JavaScript public void o
  • for循环中分号放错位置[重复]

    这个问题在这里已经有答案了 当我做作业时 我犯了一个小错误 在 for 循环中像下面的代码一样 for i 0 i
  • 如何从表单外部捕获表单的某些事件?

    我正在做一些需要监控多种表格的事情 从表单外部 并且不将任何代码放入表单内 我需要以某种方式从这些表单捕获事件 很可能以 Windows 消息的形式 但是 如何从与其相关的类外部捕获 Windows 消息呢 我的项目有一个对象 它包装了它正
  • 如何设置 C++ 函数以便 p/invoke 使用它?

    希望这是一个无脑简单的问题 但这表明我缺乏 C 专业知识 我是一名 C 程序员 过去我使用 P Invoke 和其他人的 C C dll 进行了大量工作 然而 这次我决定自己编写一个包装器 C dll 非托管 然后从 C 调用我的包装器 d
  • 如何使用 Meteor.js 对 Dropbox API 进行 CURL 调用

    我是 Meteor js 新手 希望让我的 Web 应用程序能够与 Dropbox Core API 配合使用 我无法全神贯注于使用 Meteor js 中的 HTTP 包进行 API 调用 如何在 Meteor 中进行类似于下面的 Cur
  • 将常数(2 的幂)除以整数的技巧

    NOTE这是一个理论问题 我对实际代码的性能感到满意 我只是好奇是否有替代方案 有没有一种技巧可以将常量值 本身是 2 的整数幂 除以整数变量值 而无需使用实际的除法运算 The fixed value of the numerator d