- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是特定于平台的问题。速度至关重要。将一个字节解包到一个由 8 个单精度 float 组成的数组中以便零映射到零和一映射到一的最快方法是什么?
我最终使用 8 位掩码和 7 位移位解压缩为 8 个 int32,然后使用 AVX 指令将 int32 转换为 float 。
我的平台是在支持 AVX(但没有 AVX2)的 CPU 上运行的 Windows 64 位。编译器:Visual Studio 2013。
谢谢。
最佳答案
预处理不是更快吗? 2^8 的可能性已经差不多了,不过话又说回来,把它分成两部分,它只有 2^4 = 16 个变量。
使数组包含 16 个“值”,其中每个值都是用 4 个具有正确值的 float 填充的数组。那么您的成本将仅为 2 *(将数据从预处理数组复制到新数组)。
我不太了解汇编,但两个拷贝应该比某些循环等更快。
unsigned char myByte; // input byte (pattern to create floats)
float preprocessingArrays[16][4] = {
{ 0.0f, 0.0f, 0.0f, 0.0f }, // 0000
// ...
{ 1.0f, 1.0f, 1.0f, 1.0f } // 1111
};
float result[8];
std::memcpy(&result[0], &preprocessingArrays[myByte >> 4][0], 16);
std::memcpy(&result[4], &preprocessingArrays[myByte & 15][0], 16);
// 16 = platform-specific -> floats should be 32bits -> 4bytes * 4 floats = 16
这是手写的,但是正如你所看到的,我的循环将包含两个 memcpy,一个位移和一个二进制 AND 操作(或者只有一个,但更大,memcpy,如果你想对 2^8 个值进行预处理).
对于仅 C(++) 代码,我认为这会击败循环等,但汇编代码可能更快,我不太确定。 也许您可以使用汇编程序执行memcpy
操作,一次读取整个 4 个 float ,然后在另一个调用中写入。AVX 似乎支持多达 16 个 256 位寄存器,所以可能只计算从哪个寄存器(16 个可能值)复制值到哪里,这会非常快。
也不要自己写那么多代码,只需要做一个简单的程序,为你打印预处理值,复制并粘贴到原始程序中:)
关于c++ - 将位解压缩为单精度 float 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30006584/
我知道存储单个值(或 double 值)不可能非常精确。因此,例如存储 125.12 可能会得到 125.1200074788。现在在delphi中,它们是一些有用的函数,例如samevalue或co
假设 N 是根据 IEEE754 单精度标准表示的任意数字。我想在 IEEE754 中再次找到 N/2 的最精确可能表示。 我想找到一个通用算法(用文字描述,我只想考虑必要的步骤和情况)来获得表示。
我将许多经度和纬度存储为 doubles,我想知道我是否可以将它们存储为 floats。 要回答这个问题,我需要知道 single precision floating point number 的近
我需要以一种不会丢失任何信息的方式将单精度数字表示为文本(这样我就可以得到相同的数字,可能会忽略 NaN 等),但没有太多的伪数字 - 所以单精度 0.1 出来了“0.1”不是“0.100000001
这是一个家庭作业问题。我已经在网上找到了很多代码,包括StackOverflow中的一些代码。但我只想要概念而不是代码。我想自己实现。所以我要实现的功能是: float_twice - 返回浮点参数
我需要从二进制文件中读取值。数据格式为 IBM 单精度 float (4 字节十六进制指数数据)。我有 C++ 代码从文件中读取并取出每个字节并像这样存储它 unsigned char buf[BU
我需要从二进制文件中读取值。数据格式为 IBM 单精度 float (4 字节十六进制指数数据)。我有 C++ 代码从文件中读取并取出每个字节并像这样存储它 unsigned char buf[BU
假设低端微处理器没有浮点运算,我需要生成一个 IEE754 单精度浮点格式数字以推送到文件。 我需要编写一个函数,它接受三个整数(符号、整数和分数),并返回一个字节数组,其中 4 个字节是 IEEE
我有一个由 NumPy 创建的二进制矩阵。该矩阵有 5 行和 32 列。 array([[1, 1, ..., 1, 1], [0, 1, ..., 0, 1], [1, 1, ...,
我正在尝试通过选择分数 位来创建浮点 NaN。但似乎 python float 在解释 NaN 时总是设置第 23 个小数位(IEEE754 单)。 所以,我的问题是:是否可以在不设置第 23 位的情
有没有办法转换 IEEE 单精度(32 位)列表: String result = getdata(); String[] floats = result.split(","); List float
为什么单精度 float 具有 7 位精度(或 double 15-16 位精度)? 谁能解释一下我们是如何根据分配给 float(Sign(32) Exponent(30-23), Fraction
今天我发现自己在做一些位操作,我决定稍微刷新一下我的浮点知识! 在我看到这个之前,一切都很好: ... 23 fraction bits of the significand appear in th
我想在我的目标板上测试以下内容: 'float' 是使用 IEEE 754 单精度(32 位)浮点变量实现的吗? 'double' 是否使用 IEEE 754 double (64 位)浮点变量实现?
我知道我是否有这样的号码: 1 | 1001 0001 | 0011 0011 0000 0001 0101 000 1 sign bit | 8 bit biased exponent | 23
我确定我遗漏了一些东西。我使用这个代码: int bitsVal = Float.floatToIntBits(f); String bitsString = Integer.toString(bit
我花了几个小时将小数位数更改为 8,而不是使用 VBA Access 的 2。我找到了一些使用此标签来更改系统属性的解决方案: 公共(public)常量 LOCALE_ILZERO = &H12 但它
我是一名优秀的程序员,十分优秀!