gpt4 book ai didi

tcl - 在 Tcl 中是否有 "native"方法将数字转换为 dB

转载 作者:行者123 更新时间:2023-12-02 05:07:53 24 4
gpt4 key购买 nike

分贝或 decibel是一个用于显示对数比例的单位,具体来说,我感兴趣的 dB 的定义是 X(dB) = 20log(x) 其中 x 是“正常”值,X(dB)是以 dB 为单位的值。当写了一个在 mil 之间转换的代码。和 mm,我注意到如果我使用直接方法,即乘以单位之间的比率,我在相反的转换中会出现小错误,即:to_mil [to_mm val_in_mil] 不等于到 val_in_mil 和 mm 一样。图书馆units已经解决了这个问题,因为它完成的转换没有那个计算错误。但是具体不提供(或者我没有找到)在库中将数字转换为 dB 的选项。

是否有另一个库/命令可以将数字转换为 dB 并将 dB 转换为数字而不会出现计算错误?

我做了一个使用直接数学转换的实验,我得到的是:

>> set a 0.005
0.005
>> set b [expr {20*log10($a)}]
-46.0205999133
>> expr {pow(10,($b/20))}
0.00499999999999

最佳答案

一切都是精确的问题。我们往往会忘记 float 不是实数(在数学意义上的 ℝ)。

您需要多少位小数?

例如,如果您只需要 5 位小数,则四舍五入 0.00499999999999 将得到您想要的 0.00500。

由于舍入 fp 数字不是一件容易的事,而且可能会产生更多的麻烦,您可以改变判断两个数字是否相等的方式:

 >> set a 0.005
0.005
>> set b [expr {20*log10($a)}]
-46.0205999133
>> set c [expr {pow(10,($b/20))}]
0.00499999999999
>> expr {abs($a - $c) < 1E-10}
1
>> expr {abs($a - $c) < 1E-20}
0
>> expr {$a - $c}
8.673617379884035e-19

您的示例中的数字可以被视为“相等”,直到出现错误或 10-18。请注意,这只是粗略估计,并非完整解决方案。

如果您真正处理的是对数值误差传播敏感的问题,您可能会更深入地研究“数值分析”。文章What Every Computer Scientist Should Know About Floating-Point Arithmetic或者,更好的是,这个网站:http://floating-point-gui.de可能是一个开始。

如果您需要更高的精度,您应该放弃“ native ”要求。

您可以使用 tcllib(http://tcllib.sourceforge.net/doc/bigfloat.html)提供的 BigFloat,甚至可以通过 ffidl(http://elf.org/ffidl)使用 GMP(GNU 多精度算术库)。已经为它定义了一个接口(interface):gmp.tcl

关于tcl - 在 Tcl 中是否有 "native"方法将数字转换为 dB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15997019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com