2012-07-12 88 views
0

我遇到了一些示例代码问题,我从Boulanger和Lazzarini的“The Audio Programming Book”中获得了一些示例代码。它应该为正弦波生成值,但是当我运行它时,我只能得到-0.0000000和0.0000000的值,而不是-1.0和+1.0之间的预期值。我已经看到了使用断点运行的值,并且它看起来不错,但是当它运行时(无论是在调试模式还是释放模式下)都会给我带来不好的价值。fprintf()打印0而不是完全浮点值(转换问题?)

我在MacOSX 10.6.8上使用Xcode 3.2.6。

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#ifndef M_PI 
#define M_PI (3.141592654) 
#endif 

int main(int argc, char** argv) { 

    int i, nsamps; 
    double samp; 
    double twopi = 2.0 * M_PI; 
    double angleincr; 

    nsamps = 50; 
    angleincr = twopi * nsamps; 

    for (i=0; i < nsamps; i++) { 
    samp = sin(angleincr*i); 
    fprintf(stdout, "%lf\n", samp); 
    } 

    fprintf(stderr, "done\n"); 
    return 0; 
} 

谢谢! :)

+3

你总是增加2 PI,你还期望什么? – 2012-07-12 16:42:46

+0

不是你的问题,但这也是一个非常糟糕的方法来做数学。随着角度的增加,精度将越来越低,最终达到零。你应该保留一个不被'M_PI'缩放的变量,在每次循环迭代之后减去整数部分,并且在将它传递给'sin'之前做最后一件事情时将它缩放为'2 * M_PI'。 – 2012-07-12 17:16:42

回答

5
samp = sin(angleincr*i); 

在你的代码angleincr*i始终是2π的倍数,结果确实将0

+2

谢谢你们。我意识到我的错误。 'angleincr'意思是'= twopi/nsamps',不能相乘... * Facepalm * ... – 2012-07-12 16:49:17

0

"%lf"不是printf有效的格式说明。难道在你的系统上这会试图把双重论点解释为long double

+0

在'fprintf'部分明确允许关于长度修饰符'l'结束的部分'或对后面的a,e,e,f,f,g或G转换说明符没有影响。“ (可能没有在C89,我不知道。) – 2012-07-12 19:52:52

+0

@DanielFischer,正确的标准说。我在Linux上的手册页没有,所以不知道glibc是否会忽略它或尝试做一些聪明的事情。甚至不知道MacOS将如何处理它。 – 2012-07-12 21:03:51

+0

我的手册页在“符合”一节中说,函数符合C89和C99,所以它们应该适当地忽略'lf'中的'l'。在上面的描述中可能没有必要将它包含在内,因为它毫无意义?但是,不是所有的实现都符合,即使他们声称是。 – 2012-07-12 21:10:19

0

应该根据音频编程的书的第159页是

angleincr = twopi/nsamps;