我正在用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。现在无法掌握其他编译器。
谢谢,
微内核:)
答案 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 );