Замена константы переменной с тем же значением и типом приводит к различным результатам - PullRequest
0 голосов
/ 24 апреля 2020
int main()
{
    int nodes = 7;

    int var_1 = (int)(log((double)(nodes + 1))/log(2) - 1);
    int var_2 = (int)(log((double)(7 + 1))/log(2) - 1);

    printf("%d\n", var_1);
    printf("%d\n", var_2);

    return 0;
}

Приведенный выше код инициализирует переменные var_1 и var_2 значениями 1 и 2 соответственно.

Почему они имеют разные значения, поскольку переменная nodes имеет значение 7, как и константа в следующем уравнении.

Редактировать: я не пытаюсь "исправить" код, или же я мог бы просто присвоить nodes+1 переменной.

1 Ответ

1 голос
/ 24 апреля 2020

Первый оператор, вероятно, вычисляется во время выполнения кодом, предварительно скомпилированным в стандартной библиотеке (с libm), второй оператор, вероятно, вычисляется во время компиляции компилятором (с MPFR).

Возможно log(8) на libm немного меньше, чем на MPFR .

2.079441541...7 / 0.69314... = 2.999999...
2.079441541...8 / 0.69314... = 3.000000...
...