标签: integer-division

避免浮点运算

我为 iPhone 编写了一个小型软件合成器。为了进一步调整性能,我使用 Shark 测量了我的应用程序,发现我在转换方面损失了大量时间float/SInt16

因此,我重写了一些部分,通过预先计算返回“即用型”SInt16样本的查找表来绕过转换。到目前为止效果很好。

目前,我正在尝试重写一些过滤器和我的 ADSR 包络实现,以仅使用整数算术,但我可以使用一些关于如何在没有浮点数的情况下执行乘法/除法的技巧。
我的目标是iPhone 规范格式

  • 线性PCM
  • 16 位整数样本

在不使用浮子的情况下将振幅应用于最终样本的好方法是什么?

编辑:
到目前为止我唯一想到的是,我可以通过右移当前样本来除以 2 的幂。

inBuffer[frame] = wavetable[i % cycleLengthInSamples] >> 4;
Run Code Online (Sandbox Code Playgroud)

但我想不出任何优雅的方法来创建平滑的 ADSR 信封。

Edit2: 感谢您的所有精彩回答!
我目前的做法:

  • 将我所有的 ADSR 包络值带入正SInt16范围
  • 乘以波表中的当前值(将中间值存储为SInt32
  • 将结果右移16

这似乎有效:)

iphone signal-processing fixed-point core-audio integer-division

3
推荐指数
1
解决办法
3171
查看次数

Visual C++生成DIV而不是IDIV(x86,整数运算)

我在这里使用Visual C++ 2008(9.x),当我遇到生成DIV而不是IDIV的编译器时,我正准备一个固定点值.我将代码折叠成一小块以完全重现:

short a = -255;
short divisor16 = 640; // unsigned, 16-bit
unsigned int divisor32 = 640; // unsigned, 32-bit
unsigned short s_divisor16 = 640; // signed, 16-bit
int s_divisor32 = 640; // signed, 32-bit
int16_t test1 = (a<<8)/divisor16; // == -102, generates IDIV -> OK
int16_t test2 = (a<<8)/s_divisor16; // == -102, generates IDIV -> OK
int16_t test3 = (a<<8)/divisor32; // == bogus, generates DIV -> FAIL!
int16_t test4 = (a<<8)/s_divisor32; // == -102, generates IDIV -> …
Run Code Online (Sandbox Code Playgroud)

c++ assembly integer-division visual-c++-2008

3
推荐指数
1
解决办法
706
查看次数

如何划分整数值

我想在VB.NET中执行整数除法,即只保留除法结果的整个部分.

Dim a, b, c as int32
a = 3500
b = 1200
c = a/b
Run Code Online (Sandbox Code Playgroud)

这个例子输出3.

如何让它返回2

vb.net integer-division

3
推荐指数
2
解决办法
7956
查看次数

将两个整数相除以获得 MySQL 中的浮点数

我正在 MySQL 中处理用户定义的函数,该函数采用整数 (mediumint) 并将其除以 100(即 10785 / 100 = 107.85)。提供的整数是一个称为时间的参数。我试过了

DECLARE dtime FLOAT;
SET dtime = time / 100;
DECLARE ftime VARCHAR(10);
Run Code Online (Sandbox Code Playgroud)

这导致了错误,我假设是因为我将两个整数相除并将其分配给一个浮点数

MySQL said: #1064 - You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near 
'DECLARE ftime VARCHAR(10);
Run Code Online (Sandbox Code Playgroud)

我也试过

SET dtime = CAST(time as FLOAT) / 100.0;
Run Code Online (Sandbox Code Playgroud)

但这会引发错误,因为您似乎无法将数字转换为浮点数。最后,我尝试使用十进制

DECLARE dtime DECIMAL(10,10);
SET dtime = CAST(time AS decimal(10,10)) / CAST(100 as decimal(10,10);
DECLARE …
Run Code Online (Sandbox Code Playgroud)

mysql floating-point user-defined-functions integer-division

3
推荐指数
1
解决办法
6793
查看次数

连续截断整数除法可以用乘法替换吗?

在具有有理数的小学数学中,表达式(a / b) / c相当于a / (b * c)基本的代数操作.

/在C和大多数其他语言中截断整数除法时是否相同?也就是说,我可以用所有除数的乘积用一个除法代替一系列的除法吗?

你可以假设乘法不会溢出(如果是的话,显然它们不是等价的).

c math division integer-division

3
推荐指数
1
解决办法
104
查看次数

当我们将 16 位数字除以 8 位 1 时会发生什么?

据我所知,如果我们使用带有8位数字的div指令,那么商是存储在AL中的8位数字,余数也是存储在AH中的8位数字

但是如果我们将 16 位数字除以 1 呢?

每当执行下面的代码时,我的指令指针就会丢失。

MOV AX, 9999H
MOV BL, 1
DIV BL
Run Code Online (Sandbox Code Playgroud)

有没有什么办法可以强制8086在除以AX时使用ax作为商并使用ax作为余数?

assembly tasm integer-division x86-16

3
推荐指数
1
解决办法
2147
查看次数

哪种有符号整数除法对应位移?

一个熟悉的事实是,当整数除以 2 的幂时,好的编译器会将其强度减少为位移。

例如:

int main(int argc, char **argv) {
    return argc/2;
}
Run Code Online (Sandbox Code Playgroud)

Clang -O2 将其编译为:

movl    %ecx, %eax
shrl    $31, %eax
addl    %ecx, %eax
sarl    %eax
retq
Run Code Online (Sandbox Code Playgroud)

值得注意的是,虽然这一系列指令比实际的除法指令快得多,但它并不像人们希望的那样只是一个位移。大概这是因为典型的 CPU 和 C 最终解决了截断除法(商向零舍入),而这恰好与算术右移不完全匹配(并且需要强度减少以完全保留语义)。

哪一种口味符号整数除法的完全匹配算术右移?

c bit-manipulation bit-shift integer-division

3
推荐指数
1
解决办法
183
查看次数

在 C 中,当幂设置为 1/2 时,为什么幂函数返回 1?

当我使用以下代码时,我试图复制sqrt(x)某物等于的想法X^(1/2)

pow(x, (1/2);
Run Code Online (Sandbox Code Playgroud)

无论我输入什么值,它都返回 1。我已经用 sqrt 函数解决了这个问题,但想知道为什么将来会发生这种情况。

c syntax integer-division

3
推荐指数
1
解决办法
165
查看次数

EMU8086 将 32 位数字除以 16 位数字给出意外的 0 余数

我试图使用 emu8086 工具将(无符号)8A32F4D5除以C9A5。我预计商为AF73H,余数为94B6H。编写以下代码后,我得到了正确的商,但余数变成了0000h。我错过了什么吗?

.MODEL SMALL
.STACK 100H
.DATA 
.CODE 

MAIN PROC 
; initialize DS
MOV AX,@DATA 
MOV DS,AX 
; enter your code here
MOV DX, 8A32H
MOV AX, 0F4D5H 
MOV BX, 0C9A5H

DIV BX

;exit to DOS 
               
MOV AX,4C00H
INT 21H 

MAIN ENDP
    END MAIN 
Run Code Online (Sandbox Code Playgroud)

EMU8086中的输出:

在此输入图像描述

x86 assembly integer-division x86-16 emu8086

3
推荐指数
1
解决办法
1142
查看次数

为什么 AMD Zen 上较大值的整数除法吞吐量差异很小?

我很好奇将两个值除以不同数量的值位但操作数(寄存器)位不变时的性能差异。我预计性能取决于被除数的最高设置位,因为我假设 CPU 内部的迭代减法和移位“算法”可能在一个时钟周期内进行多次迭代。

所以我写了一个 C++20 程序来测试这个:

#include <iostream>
#include <iostream>
#include <type_traits>
#include <cstdint>
#include <random>
#include <limits>
#include <atomic>
#include <chrono>
#include <vector>
#include <sstream>

using namespace std;
using namespace chrono;

int main()
{
    constexpr size_t ROUNDS = 100'000'000;
    auto ssp = []<typename TOp, typename TValue>() -> double
        requires is_unsigned_v<TOp> && is_unsigned_v<TValue> && (sizeof(TOp) >= sizeof(TValue))
    {
        constexpr size_t N = 0x1000;
        vector<TOp> vDividends( N ), vDivisors( N );
        mt19937_64 mt;
        uniform_int_distribution<unsigned> uidBits( 0, sizeof(TValue) * CHAR_BIT - 1 …
Run Code Online (Sandbox Code Playgroud)

performance x86 assembly cpu-architecture integer-division

3
推荐指数
1
解决办法
537
查看次数