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)确实定义了float
和double
类型的最小 所需范围。就像整数类型一样,这些都是通过描述类型的 C 宏来实现的。因此,例如,FLT_MAX
、DBL_MAX
和 LDBL_MAX
必须至少为 1E+37。【参考方案2】:
简单的答案是您的分母(用于规范化 16 位数据)是 2^15(假设已签名 PCM)。
将所有传入的 16 位数据除以 32767 是我的标准化解决方案。或许32768可以做个案例,数据范围是-32768到32767,但我一直用32767。
【讨论】:
以上是关于16 位双精度值的最大值(和最小值)是多少?的主要内容,如果未能解决你的问题,请参考以下文章