неправильное поведение функции журнала !!! Любая подсказка? - PullRequest
2 голосов
/ 18 августа 2010

Я пишу какую-то программу на C. Она имеет часть, где она делает некоторые вычисления вероятностей, где я использую функцию журнала. журнал функций обычной библиотеки () ...

код примерно такой

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 ]

8 голосов
/ 18 августа 2010

Вам нужно #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;
}
0 голосов
/ 18 августа 2010

Похоже, ваш синтаксис правильный. Как вы печатаете свои результаты? Если вы используете оператор printf, убедитесь, что вы правильно указали строку формата.

Это должно идти как в в этом примере :

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