日志功能不当行为!任何线索?

时间:2010-08-18 16:26:35

标签: c++ c visual-c++ visual-studio-2005

我正在用C编写一些程序。它有一个部分用于进行一些概率计算,我正在使用log函数。普通库函数log()...

代码是这样的

double somevalue = 0.29558101472995091;
temp = log(somevalue)

猜猜是什么?温度值为-1856.0000000000000 !!!

由于log给出的值在某些结构中,我也编写了这个测试代码,得到了相同的结果......

int main()
{
    double somevalue;
    double temp;

    somevalue = 0.29558101472995091;
    temp = log(somevalue);
    return 0;
}

Results:
Somevalue = 0.29558101472995091
temp = -1856.0000000000000

不是很疯狂。任何人都有一些关于这里发生什么的线索。

我正在使用Visual Studio 2005。现在无法掌握其他编译器。

谢谢,

微内核:)

2 个答案:

答案 0 :(得分:8)

您需要#include <math.h>,以便编译器正确调用log()

使用VC10时,如果包含printf ("log(%lf) = %lf\n", somevalue, temp ),我会从math.h获得以下结果:

log(0.295581) = -1.218812

如果未包含math.h,我会:

log(0.295581) = -1856.000000

可能发生的事情是编译器希望调用log()的返回值为int,然后将其转换为double以存储在temp中。我不知道编译器如何返回浮点结果,但我猜它们会在FP(0)寄存器中返回,而在EAX中返回一个int结果(假设是x86) Win32平台)。因此,在这种情况下,编译器的值可能与log()函数尝试返回的值没有任何关系。

如果您将警告级别设置为/W3,则会收到有关此问题的警告:

C:\TEMP\test.c(10) : warning C4013: 'log' undefined; assuming extern returning int

在我看来,除非你正在使用一个没有利用函数原型的真正旧的代码库,否则将该警告转换为错误可能是很有意义的(当然,当编译为C ++时这已经是错误):

#pragma warning( error : 4013) // or use the `/we4013` compiler option

这是可编辑的测试:

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

int main()
{
    double somevalue;
    double temp;

    somevalue = 0.29558101472995091;
    temp = log(somevalue);

    printf ("log(%lf) = %lf\n", somevalue, temp);

    return 0;
}

答案 1 :(得分:0)

看起来你的语法是正确的。你打印你的结果怎么样?如果您使用的是printf语句,请确保您的格式字符串正确无误。

它应该像this example中那样:

printf ("log(%lf) = %lf\n", somevalue, temp );