Неправильное поведение функции журнала!!! Любая подсказка?

Я пишу какую-то программу на 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 );
Другие вопросы по тегам