16 位双精度值的最大值(和最小值)是多少?

Posted

技术标签:

【中文标题】16 位双精度值的最大值(和最小值)是多少?【英文标题】:What is the maximum (and minimum) 16-bit double value? 【发布时间】:2021-05-20 14:59:04 【问题描述】:

我正在处理音频数据处理(来自/到WAV 文件,16 位),表示具有double 值(64 位)的样本。

由于我正在处理大量幅度域卷积,所以很多时候我的结果样本的(正或负)值“高于”可以用 16 位表示的“最大数据”,并且结果是它们被截断了。

所以我需要先规范化我的数据,然后再将其写入WAV 文件。

但我不清楚可以在 16 位上表示的最大(和最小)double 值是多少。

注意:这里我指的最小值是16位能表示的最大负双精度数。

编辑:16-bits double 我指的是从 16 位 WAV 文件中读取的数据,作为 double 值存储在我的代码中。经过幅度卷积后,这个数据发生大于1或小于-1。

【问题讨论】:

@Ted Lyngmo 感谢您的回答,我需要澄清一下:如何再次将其转换为 double ?我需要在 wav 文件中写入双精度值。一个简单的static_cast<double> result; 可以吗? -32,768 到 +32,767 是 16 位有符号整数的范围。把它变成双精度不应该改变这一点。 https://ideone.com/ZnbKfR 这是一个描述 16 位浮点位布局的 Wikipedia 条目:IEEE 16-bit floating point 【参考方案1】:

16 位双精度值的最大值(和最小值)是多少?

不清楚您所说的“16 位双精度”是什么意思。

C++ 中有一个数字类型double。它是一个浮点类型。 C++ 语言没有定义其最大或最小可表示值(尽管它确实定义了一个最小范围,实现可能会超过该范围),但可以使用std::numeric_limits 检查这些限制。

但是,在大多数系统上,double 是 64 位类型,即 IEEE-754 标准中指定的“双精度”浮点类型。


一个 16 位类型最多可以表示 216 个不同的值。

如果用来表示无符号整数,范围为[0, 216)。

如果用于表示有符号整数,则范围将取决于符号的表示方式。在最常见的 2 补码表示中,范围为 [-216-1, 216-1)

WAV 文件

在 Microsoft WAVE 格式中,16 位样本是 2 的补码有符号整数。有关它们的取值范围,请参见上一段。

【讨论】:

我编辑了这篇文章以阐明我对 16 位双精度的含义。 次要观点:C++(通过 C)确实定义了floatdouble 类型的最小 所需范围。就像整数类型一样,这些都是通过描述类型的 C 宏来实现的。因此,例如,FLT_MAXDBL_MAXLDBL_MAX 必须至少为 1E+37。【参考方案2】:

简单的答案是您的分母(用于规范化 16 位数据)是 2^15(假设已签名 PCM)。

将所有传入的 16 位数据除以 32767 是我的标准化解决方案。或许32768可以做个案例,数据范围是-32768到32767,但我一直用32767。

【讨论】:

以上是关于16 位双精度值的最大值(和最小值)是多少?的主要内容,如果未能解决你的问题,请参考以下文章

从 JavaScript 数组中获取对象值的最大值和最小值

使用分治法是不是会提高在数组中查找最大值和最小值的时间复杂度

MACD ,DIFF, DEA最大最小数值是多少?

求数组所有区间最大值减去最小值之差的和(贝壳笔试题)

窗口内最大值与最小值的更新结构

从双数组中获取最小值不起作用