Неправильное поведение функции журнала!!! Любая подсказка?
Я пишу какую-то программу на C. Она имеет часть, где она выполняет некоторые вычисления вероятностей, где я использую функцию 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 ответа
Вам нужно #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;
}
Похоже, ваш синтаксис правильный. Как вы печатаете свои результаты? Если вы используете оператор printf, убедитесь, что вы правильно указали строку формата.
Это должно идти как в этом примере:
printf ("log(%lf) = %lf\n", somevalue, temp );