Вам нужно #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), а результат int возвращается в EAX (при условии 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;
}