【问题标题】:Double returns 0 [duplicate]双返回 0 [重复]
【发布时间】:2012-12-04 20:53:04
【问题描述】:

可能重复:
C programming division

我正在尝试将值转换为 Mel 过滤器,但每次输出结果时,它始终为“0”,即使它是双精度值。它应该是一个浮点数吗?这是一篇关于等式的文章:http://en.wikipedia.org/wiki/Mel_scale

这里是函数:

double MFCC::mel_filter(int val)
{
     double tmp;
     tmp = 2595 * log10(1 + val / 700);
     cout << tmp << endl;
     return tmp;
    }

    vector<double> MFCC::mel_frame(int size)
    {
    vector<double> mel_Frame;
    for(int i=1; (i < size); i++)
    {
          this->mel_filter(i);
    }

    return mel_Frame;
    }

在main中,我将传递诸如.. (1, 2, 3, 4, 5, 6, 7 ......)之类的值

如果输入“1”,则等式为:

m = 2595 * log10(1 + 1 / 700) = 1.6

有什么帮助或建议吗?

【问题讨论】:

  • 让你的值加倍,而不是整数。即 2595.0、1.0、700.0
  • 尝试1 + val/700.0 -- 如果两个操作数都是整数,/ 是整数除法
  • 尽管您声明并返回vector&lt;double&gt; mel_Frame;,但您从未真正向其中写入任何值,这毫无价值。您的函数将始终返回一个空向量。
  • @meagar 我正在测试,我会写信给它。

标签: c++ double


【解决方案1】:

你的问题出在

log10(1 + val / 700)

这是使用整数除法而不是实数除法。试试

log10(1 + val / 700.0)

【讨论】:

    【解决方案2】:

    val 的类型是 int。所以表达式val / 700 是用整数算术计算的。结果为零。

    【讨论】:

      【解决方案3】:

      当您使用整数文字时,会使用整数算术。这意味着任何小数都将四舍五入。将常量显式写为十进制数,将使用双精度运算:

      tmp = 2595.0 * log10(1.0 + val / 700.0);
      

      【讨论】:

        【解决方案4】:

        试试

        log10(1 + val / (float) 700)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-17
          • 2019-10-25
          • 1970-01-01
          • 2014-12-14
          • 2012-01-30
          • 2012-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多