Что-то действительно странное с функцией C ++ exp () - PullRequest
5 голосов
/ 09 мая 2020

При привязке к реализации функции mySqrt в C ++ я использовал функцию exp () следующим образом:

int mySqrt(int x) {
    // For x = 2147395600
    cout << exp(0.5*log(x)) << "  ";     // It prints 46340
    return exp(0.5*log(x));              // But returns 46339
}

Я попытался найти в Google причину такого поведения, но не смог найти что-нибудь. Я даже пробовал использовать double , но все тот же результат.

Любое объяснение этому?

1 Ответ

6 голосов
/ 09 мая 2020

С этим кодом

#include <iostream>
#include <cmath>
#include <cstdio>
using std::cout;

int mySqrt(int x) {
    // For x = 2147395600
    cout << exp(0.5*log(x)) << "  ";     // It prints 46340
    return exp(0.5*log(x));              // But returns 46349
}

int main(void) {
    std::cout << mySqrt(2147395600) << "\n";
    printf("%.30f\n", exp(0.5*log(2147395600)));
    return 0;
}

Я получил результат :

46340  46339
46339.999999999978172127157449722290

Кажется, значение округляется при передаче до cout, а при преобразовании усекается на int.

...